use*_*160 6 mysql mysql5 debian-lenny
抱歉,我看到了类似的线程,但我仍然找不到它解决我的问题,另外,我需要更多关于此的信息。
要求:创建现有数据库“db3”的精确副本“db4”。
程序如下:
第2步抛出错误:
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 数据库的某些表时,我能够看到丢失的记录。
问题:
这是否表明 db3 数据库已损坏/有问题?
如何继续创建 db3 的“一致/工作”副本 (db4)?
谢谢,
出现这种“重复”的原因有多种:
错误消息确实引用了第一个键,在大多数数据库模式中它是第一个值。查看原始转储输出,特别是 INSERT 语句并检查
INSERT INTO ... values (0,...
扫描错误消息中给出的 mysql 转储的行号。
我期待什么样的 mysqldump 的示例:
INSERT INTO foo (id,bar,baz) values (1,2,3);
INSERT INTO foo (id,bar,baz) values (0,4,5);
INSERT INTO foo (id,bar,baz) values (2,6,7);
Run Code Online (Sandbox Code Playgroud)
在自动增量字段上的“正常”INSERT 语句中,值“0”指定自动增量字段,因此不应显示在使用自动增量字段的数据库 SQL 转储中。通过 SQL 转储重新加载数据库,转储会要求 SQL 服务器将当前字段值加一并插入该 ID。如果有人在插入记录后手动将身份更新为零,您的 MySQL 转储也会包含这个奇怪的 ID。
如果您将此转储重播到空表中,则会尝试创建以下记录:
1,2,3
2,4,5
2,6,7
Run Code Online (Sandbox Code Playgroud)
由于“id”字段已设置为唯一自动增量,第二个 INSERT 将创建一条“错误”记录(预期:0,4,5;实际:2,4,5),该记录与以下记录(id=2)冲突)并因此给出错误消息。
在这种情况的变体中,有人“手动”将身份更新为已经存在的值,然后将记录更改为“唯一”。将记录类型更改为唯一不会使 MySQL 重新验证当前数据是否符合要求,因此会出现延迟错误。此变体可能会创建如下转储:
INSERT INTO foo (id,bar,baz) values (1,2,3);
INSERT INTO foo (id,bar,baz) values (1,4,5);
INSERT INTO foo (id,bar,baz) values (2,6,7);
Run Code Online (Sandbox Code Playgroud)
由于唯一约束,尝试插入第二行将失败。
在这两种情况下,使用“--force”只会忽略“冲突”行并继续导入。“冲突”行将丢失,但可能导致此冲突的行将存在(但具有错误的 id 记录)。
如果我的想法与您的问题相符,请检查您的数据库转储。如果是这种情况,这里有两个解决方法可以“使其发挥作用”:
分两步导入数据,首先仅导入架构,然后导入数据。在导入数据之前从架构中删除唯一约束,稍后再次添加唯一约束(“ALTER TABLE ...添加唯一...”)。
强制导入架构和所有数据,导致“不同”的约束问题。手动检查哪些记录是正确的,并将错误的记录重新分配为其原始值。
后一期的例子:
mysql -uuser -ppass --execute "SET UNIQUE_CHECKS=0; source db3.sql" db4
Run Code Online (Sandbox Code Playgroud)
这确实会强制导入所有冲突的记录,甚至违反任何真正的唯一约束。导入后,您将拥有这三个记录(600806、187694 和 1567400)的多个条目,并且您必须通过检查转储手动找出哪些是正确的条目,哪些“重复项”确实导致了冲突并手动将错误记录“恢复”为零(或转储中冲突的行所说的任何内容)。
在这两种情况下,您的数据仍然违反给定的架构:您的架构表示数据是唯一的,但事实并非如此。从长远来看,数据需要在应用程序级别上固定。
归档时间: |
|
查看次数: |
14373 次 |
最近记录: |