恢复备份时mysql重复输入错误1062

use*_*160 5 mysql mysql-5 mysqldump backup restore

抱歉,我看到了类似的帖子,但我仍然找不到它解决我的问题,另外,我需要更多关于此的信息。

要求:创建现有数据库“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"
Run Code Online (Sandbox Code Playgroud)

我用 --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
Run Code Online (Sandbox Code Playgroud)

完成后,当我查询 db4 数据库的某些表时,我能够看到丢失的记录。

题:

  1. 这是否表明 db3 数据库已损坏/有问题?

  2. 如何继续创建 db3 的“一致/工作”副本 (db4)?

  3. 如果(2)失败,如何排除故障并找出其发生的原因?

谢谢,

Mic*_*bot 8

我建议这确实表明db3. 默认情况下,mysqldump 生成“扩展”插入语句,每行包含多于一行的插入。

INSERT INTO table_name VALUES (...), (...), (...), ...;
Run Code Online (Sandbox Code Playgroud)

这是一种优化,因为在单个语句中多次插入比执行单个插入语句要快得多。

但是,您可以使用该--skip-extended-insert选项禁用此行为。

使用该选项进行备份不是一个好主意,因为它们的恢复速度要慢得多,但是此选项确实使转储文件更容易用你的眼球阅读,并且更容易使用grep或类似工具搜索特定记录.

使用此选项转储数据库,然后在文件中搜索抛出错误的重复键,您似乎很可能会找到重复的行或具有重复键的行,这些行应该是唯一的......这意味着底层表有问题db3.

我想不出这可能发生的方式,InnoDBMyISAM显然有可能。

还有一些其他mysqldump选项也可能有用:

  • --replace生成一个文件写报表REPLACE INTO,而不是INSERT INTO这将导致在以后的文件替换发生冲突的记录早在文件中出现中出现的重复键的记录,不产生错误
  • --insert-ignore生成一个文件,其语句编写为INSERT IGNORE INTO而不是INSERT INTO,这将导致文件中较早出现的重复键记录保留在恢复的表中,因为稍后的冲突记录将被忽略,不会插入,并且不会产生错误。