Mysql
如何在恢復 mysqldump 文件時跳過現有數據?
我使用此查詢使用 MySQL Dump(命令提示符/命令行)導入數據
mysql -u root -p database_name < database_name.sql
到目前為止,我想導入大型數據庫(僅新的增量),我刪除數據庫並重新導入,但我只想導入新的增量。
我有四 (4) 條建議:
建議#1:重新創建轉儲
INSERT IGNORE
編寫 INSERT IGNORE 語句而不是 INSERT 語句。
重新載入會發生什麼???
- 新數據被插入。
- 已經存在的主鍵被跳過
建議#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
編寫 REPLACE 語句而不是 INSERT 語句。
重新載入會發生什麼???
- 新數據被插入。
- 已經存在的主鍵將被刪除並重新插入
建議#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
試試看 !!!
我會從不信任轉儲開始。因此,我會將數據載入到單獨的數據庫(或至少單獨的表)中。然後我會執行一些 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 ... ;