Mysql

如何在恢復 mysqldump 文件時跳過現有數據?

  • August 24, 2020

我使用此查詢使用 MySQL Dump(命令提示符/命令行)導入數據

mysql -u root -p database_name < database_name.sql

到目前為止,我想導入大型數據庫(僅新的增量),我刪除數據庫並重新導入,但我只想導入新的增量。

我有四 (4) 條建議:

建議#1:重新創建轉儲INSERT IGNORE

使用–insert-ignore

編寫 INSERT IGNORE 語句而不是 INSERT 語句。

重新載入會發生什麼???

  • 新數據被插入。
  • 已經存在的主鍵被跳過

建議#2:更改INSERTINSERT 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

編寫 REPLACE 語句而不是 INSERT 語句。

重新載入會發生什麼???

  • 新數據被插入。
  • 已經存在的主鍵將被刪除並重新插入

建議#4:更改INSERT INTOREPLACE 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

試試看 !!!

我會從不信任轉儲開始。因此,我會將數據載入到單獨的數據庫(或至少單獨的表)中。然後我會執行一些 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 ... ;

引用自:https://dba.stackexchange.com/questions/274218