mysqldumpファイルの復元中に既存のデータをスキップする方法は?

Aug 24 2020

このクエリを使用して、MySQLダンプを使用してデータをインポートします(コマンドプロンプト/コマンドライン)

mysql -u root -p database_name < database_name.sql

大規模なデータベース(新しいデルタのみ)をインポートしたいので、データベースを削除して再インポートしますが、新しいデルタのみをインポートしたいと思います。

回答

2 RolandoMySQLDBA Aug 24 2020 at 22:42

私は4つの提案があります:

提案#1:でダンプを再作成する INSERT IGNORE

--insert-ignoreを使用します

INSERTステートメントではなくINSERTIGNOREステートメントを記述します。

リロードするとどうなりますか?

  • 新しいデータが挿入されます。
  • 既存の主キーはスキップされます

提案#2:変更INSERTへのINSERT IGNOREリロードの

通常ロードする代わりに

mysql -u root -p database_name < database_name.sql

ダンプをsedにパイプして、次のようにリロードするだけです。

cat database_name.sql|sed 's/^INSERT/INSERT IGNORE/'|mysql -u root -p database_name

提案#3:でダンプを再作成する REPLACE INTO

--replaceを使用します

INSERTステートメントではなくREPLACEステートメントを記述します。

リロードするとどうなりますか?

  • 新しいデータが挿入されます。
  • 既存の主キーは削除され、再挿入されます

提案#4:変更INSERT INTOへのREPLACE INTOリロードの

通常ロードする代わりに

mysql -u root -p database_name < database_name.sql

ダンプをsedにパイプして、次のようにリロードするだけです。

cat database_name.sql|sed 's/^INSERT INTO/REPLACE INTO/'|mysql -u root -p database_name

概要

  • ダンプを再作成できる場合は、提案1または3を使用してください
  • ダンプを再作成できない場合は、提案2または4を使用してください

試してみる !!!

1 RickJames Aug 24 2020 at 23:14

私はダンプを信用しないことから始めます。したがって、データを別のデータベース(または少なくとも別のテーブル)にロードします。次に、いくつかのSQLクエリを実行して、デルタが期待どおりであることを確認します。これが「新しい」行であるか、「重複」する一意のIDがないかなどです。問題が見つかった場合は、SQLを作成して問題に対処します。 。Rolandoが示唆しているように、INSERT / REPLACE [IGNORE]などが必要な場合があります。

DELETE'新しい'行のいくつかを、INSERT .. SELECT残りをメインテーブルにシャベルで入れるかもしれません。または、同等に(ただし、おそらくより高速に)INSERT .. SELECT .. WHERE ..、目的の行のみをシャベルで移動します。

FOREIGN KEYsトラブルの原因にもなりますのでご注意ください。

配置されていないPRIMARY KEYs場合でも、コードに含まれているJOINに注意してくださいFOREIGN KEYs

IODKUは通常よりも優れていREPLACEます。そしてそれは次の方法で行うことができます:

INSERT INTO t2 (...)
    SELECT ... FROM t1 WHERE ...
    ON DUPLICATE KEY UPDATE ... ;