MySQL“重复条目”错误在从属服务器上始终中断复制

MySQL“重复条目”错误在从属服务器上始终中断复制

我遵循了本教程:

https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql

不幸的是,从服务器上的复制总是停止,如下所示:

[ERROR] Slave SQL: Error 'Duplicate entry '6443185' for key 'PRIMARY'' on query. Default database: 'testdb'. Query: 'INSERT INTO ultimate_cron_lock (name, current, expire) VALUES ('ultimate_cron_serial_launcher_1', '0', '1424077478.0243')', Error_code: 1062

如果我删除所有数据库,那么我该如何告诉 Mysql 从属服务器自动创建它们?

我没有在 Master 上指定 binlog_do_db=,这意味着它应该为所有 db 执行二进制日志,在 Slave 上我只忽略了几个数据库:

server-id       = 2
relay-log               = /var/lib/mysql/binlog/mysql-relay-bin.log
log_bin         = /var/lib/mysql/binlog/mysql-bin.log

replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql

谢谢

答案1

所有建议中最具破坏性的建议是使用 来自动化灾难slave-skip-errors。这是获取不一致的从属数据库的快速方法。请不惜slave-skip-errors一切代价避免设置。

同时,我可以说,导致从属错误的最常见原因是没有意识到 mysql 从属默认情况下不是只读的。如果您使用频繁切换,您的某些客户端可能仍会将更改写入从属。要摆脱这种情况,您应该read_only = on在从属服务器上进行设置。

答案2

您也许可以这样做,但这需要重放自原始数据库创建以来的每一个事务。除了这样做效率很低之外,它还要求从要复制的数据库创建时起就设置好事务日志,并且永远不会被截断,而根据我的经验,这种情况很少发生。

答案3

您可以在从属的 my.cnf 中设置以下内容:

[mysqld]
slave-skip-errors=1062

但随着文档说:

除非您完全理解错误的原因,否则请不要使用此选项。

该问题可能是由您的应用程序中的计时/竞争条件引起的,您应该寻找解决方案。

正如文档所警告的那样:

不加区别地使用此选项将导致从属服务器与主服务器完全不同步,而您不知道为什么会发生这种情况。

如果您确实使用此选项而不是调查您的应用程序,您应该运行pt-表校验和频繁地。

相关内容