web-dev-qa-db-ja.com

mysqldumpから存在しない場合はテーブルを作成します

Mysqldumpに適切なテーブル作成オプション[IFNOTEXISTS]を追加する方法があるかどうか疑問に思っています。何か案は?

24
khelll

1つのソース によると、mysqldumpはこのオプションを備えていません。

ダンプファイルをインポートして戻すときに--forceオプションを使用できます。この場合、MySQLは重複テーブルを作成しようとしたときに生成されたエラーを無視します。ただし、この方法では、他のエラーも無視されることに注意してください。

それ以外の場合は、CREATE TABLEのすべての出現箇所をCREATE TABLE IF NOT EXISTSに置き換えるスクリプトを使用してダンプファイルを実行できます。

18
Daniel Vassallo

SQLファイルでこれを使用してみてください。

sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>

または保存する

sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>

それは理想的ではありませんが、機能します:P

25
Pawel

@Pawelで説明されているようにsedを使用するとうまくいきます。それでも、絶対に必要な以上の潜在的なエラーソースを介してデータをパイプするというアイデアは気に入らないかもしれません。この場合、2つの別々のダンプを使用できます。

  • テーブル定義を含む最初のダンプ(--no-data --skip-add-drop-table
  • データのみの2番目のダンプ(--no-create-info --skip-add-drop-table

ただし、他にも注意が必要なことがいくつかあります(トリガーなど)。詳細はマニュアルをご確認ください。

11
sfussenegger

あなたが望むかもしれないものではなく、--add-drop-tableすべてのCREATEには、対応するDROPTABLEステートメントのプレフィックスが付いています。

それ以外の場合は、単純な検索/置換を行います(たとえば、sedを使用)。

5
Boldewyn

これを使用してbashスクリプトを作成します...必ず実行可能にしてください。 (chmod 0777 dump.sh)

dump.sh

#!/bin/bash

name=$HOSTNAME
name+="-"
name+=$(date +"%Y-%m-%d.%H:%M")
name+=".sql"
echo $name;
mysqldump --replace --skip-add-drop-table --skip-comments izon -p > "$name"
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' "$name"
2
Artistan

Sedは、末尾に「g」(グローバル)がないと、はるかに高速になります。

例えば:

mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql 
1
Celepine

ダンプ出力はDROPとCREATEの組み合わせであるため、DROPステートメントを削除し、CREATEステートメントを変更して有効な(論理)出力を作成する必要があります。

 mysqldump --no-data -u root <schema> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /'| sed 's/^DROP TABLE IF EXISTS /-- DROP TABLE IF EXISTS /' > <schema>.sql
1
Mostafa

テキストを検索して置き換えるにはPowerShellを使用するWindows 7の場合

コマンドプロンプトを開き、以下のコマンドを使用します

powershell -Command "(gc E:\map\map_2017.sql) -replace 'CREATE TABLE', 'CREATE TABLE IF NOT EXISTS' | Out-File E:\map\map_replaced.sql"
  • 最初のパラメータはファイルパスです

  • 2番目のパラメータは「文字列の検索」です

  • 3番目のパラメータは「文字列の置換」です

このコマンドは、置き換えられたテキストで新しいファイルを作成します。 '|'で始まるコマンドを削除します(パイプ)同じファイルの内容を置き換えて保存する場合。

0
Franc