Mysql

mysql 恢復備份時出現重複條目錯誤1062

  • August 7, 2020

抱歉,我看到了類似的執行緒,但我仍然找不到它解決我的問題,另外,我需要更多關於此的資訊。

**要求:**創建現有數據庫“db3”的精確副本“db4”。

遵循的程序:

  • mysqldump -uuser -ppass db3 > db3.sql (大小為6G)
  • mysql -uuser -ppass db4 < db3.sql (db4 是一個新創建的空白數據庫)

第二步拋出錯誤:

ERROR 1062 (23000) at line 5524: Duplicate entry '600806' for key 1"

我用 –force 再次執行了第二步。還原已完成,但出現 2 個額外的類似錯誤:

ERROR 1062 (23000) at line 6309: Duplicate entry '187694' for key 1    
ERROR 1062 (23000) at line 6572: Duplicate entry '1567400' for key 1

完成後,當我查詢 db4 數據庫的某些表時,我能夠看到失去的記錄。

題:

  1. 這是否表明 db3 數據庫已損壞/有問題?
  2. 如何繼續創建 db3 的“一致/工作”副本 (db4)?
  3. 如果(2)失敗,如何排除故障並找到其發生的原因?

謝謝,

我建議這確實表明db3. 預設情況下,mysqldump 生成“擴展”插入語句,每行包含多於一行的插入。

INSERT INTO table_name VALUES (...), (...), (...), ...;

這是一種優化,因為單個語句中的多個插入比執行單個插入語句要快得多。

--skip-extended-insert但是,您可以使用該選項 禁用此行為。

使用該選項進行備份不是一個好主意,因為它們的恢復速度要慢得多,但是此選項確實使轉儲文件更容易用您的眼球閱讀,並且更容易使用grep或類似工具搜尋特定記錄.

使用此選項轉儲數據庫,然後在文件中搜尋引發錯誤的重複鍵,您似乎會發現重複行或具有重複鍵的行應該是唯一的……這意味著底層表存在問題db3.

我想不出一種可能發生這種情況的方法,InnoDBMyISAM它顯然是可能的。

還有一些其他mysqldump選項也可能有用:

  • --replace生成一個寫入語句的文件,REPLACE INTO而不是INSERT INTO會導致文件中稍後出現的重複鍵記錄替換文件中較早出現的衝突記錄,而不會生成錯誤
  • --insert-ignore生成一個文件,其中的語句寫成INSERT IGNORE INTO而不是INSERT INTO,這將導致文件中較早出現的重複鍵記錄保留在恢復的表中,因為後面的衝突記錄將被忽略,不會插入,也不會產生錯誤。

甚至可以在 mysqldump 文件中 使用Insert Ignore into搜尋和替換每次出現的Insert into 。

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