Mysqldumpに適切なテーブル作成オプション[IFNOTEXISTS]を追加する方法があるかどうか疑問に思っています。何か案は?
1つのソース によると、mysqldumpはこのオプションを備えていません。
ダンプファイルをインポートして戻すときに--force
オプションを使用できます。この場合、MySQLは重複テーブルを作成しようとしたときに生成されたエラーを無視します。ただし、この方法では、他のエラーも無視されることに注意してください。
それ以外の場合は、CREATE TABLE
のすべての出現箇所をCREATE TABLE IF NOT EXISTS
に置き換えるスクリプトを使用してダンプファイルを実行できます。
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
@Pawelで説明されているようにsed
を使用するとうまくいきます。それでも、絶対に必要な以上の潜在的なエラーソースを介してデータをパイプするというアイデアは気に入らないかもしれません。この場合、2つの別々のダンプを使用できます。
--no-data --skip-add-drop-table
)--no-create-info --skip-add-drop-table
)ただし、他にも注意が必要なことがいくつかあります(トリガーなど)。詳細はマニュアルをご確認ください。
あなたが望むかもしれないものではなく、--add-drop-table
すべてのCREATEには、対応するDROPTABLEステートメントのプレフィックスが付いています。
それ以外の場合は、単純な検索/置換を行います(たとえば、sed
を使用)。
これを使用して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"
Sedは、末尾に「g」(グローバル)がないと、はるかに高速になります。
例えば:
mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql
ダンプ出力は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
テキストを検索して置き換えるには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番目のパラメータは「文字列の置換」です
このコマンドは、置き換えられたテキストで新しいファイルを作成します。 '|'で始まるコマンドを削除します(パイプ)同じファイルの内容を置き換えて保存する場合。