方面1:复制
我不认为
replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup
永远在一起。
其他人也想知道
该问题源于订单复制规则的处理。根据有关复制规则的MySQL文档:
如果指定了任何--replicate-rewrite-db选项,则会在测试--replicate- *过滤规则之前应用它们。
甚至复制-rewrite-db上的MySQL文档都说:
在测试--replicate- *规则之前,已完成数据库名称转换。
该replicate-wild-do-table
重写后执行。如果此排序以某种方式将INSERT强制插入到已经有数据的表中,就不足为奇了。
您可能会问数据是如何到达那里的?
方面#2:mysqldump
这样做mysqldump --single-transaction
似乎是及时转储数据的最佳方法。不幸的是,mysqldump --single-transaction
有一个致命弱点:ALTER TABLE
。如果表受制于任何ALTER TABLE
命令,例如DROP TABLE
和CREATE TABLE
,可能会破坏mysqldump试图进行转储的事务的完整性。截断表(在MySQL Universe中为DDL)并删除和添加索引可以也同样具有破坏性。
您可以从MySQL Performance Blog的“ 最佳保存的MySQLDump Secret”中找到有关此信息的更多信息。我实际上在过去的问题中解决了这一点,该问题描述了12条可能破坏mysqldump事务完整性的命令:MySQL备份InnoDB
警告
结语
由于重写规则或mysqldump的隔离被覆盖,这两个方面中的一个或两个都可能导致在mysqldump期间不应该存在的行滑入。
建议
自从mysqldump开始以来,我将对所有中继日志进行mysqlbinlog转储,以查看Slave将处理的所有INSERT,并查看这些行是否已存在于Slave上。如果这样做,您可能会做两件事:
1:跳过所有重复键错误
只需将其添加到从站上的my.cnf
[mysqld]
slave-skip-errors=1062
skip-slave-start
并重启mysql。然后跑START SLAVE;
所有重复键错误都会被绕过。当Seconds_Behind_Master
变为0时,删除这些行并重新启动mysql。
2:下载percona工具
您需要的工具是
使用这些来找到从站中的差异,然后更正它们