我们使用非常简单的 MASTER->SLAVE MySQL 基于查询的复制。
每天午夜,从属服务器上的 cron 脚本都会停止复制 SQL_THREAD,使用 mysqldump 备份从属服务器数据库,然后重新启动复制 SQL_THREAD。
但是,在复制重新启动后,它会立即停止,并在 SHOW SLAVE STATUS\G 中显示此错误输出
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '54149' for key 1' on query. Default database: 'dbname'. Query: 'insert into emails (emailsubject,emailmessage,html) values (blah','blah', false);'
问题似乎是从服务器上的复制日志正在重播已经处理过的语句。
MySQL 错误跟踪器似乎同意我的观点:http://bugs.mysql.com/bug.php?id=38205#c200483
因为复制看起来是如此基本和标准的过程,所以我的问题是:我们如何绕过尝试重播语句的复制?
附录:我想使用标签“start-stop”、“replaying”和“statements”来创建这篇文章,但我的声誉不够高(看起来很傻?)
答案1
您是否需要停止复制来运行转储,mysqldump 可以使用该--lock-all-tables
选项获取全局读锁。
答案2
我们有一个类似的设置,并使用 mysqldump 运行备份,而无需停止复制。
mysqldump --host=$HOST -u $USER --password=$PASSWORD --max_allowed_packet=512M --port=3306 --single-transaction --skip-add-locks --quick --master-data=2
这对我们有用。
答案3
您引用的错误线程似乎表明该问题不会影响 InnoDB 表,并且已在 5.1.35 中修复。我理解得对吗?
您使用的是什么表类型?MySQL 是什么版本?此外,您是否使用事务?
希望这可以帮助!
答案4
您可以配置 MySQL,以便复制在出现此特定错误后继续:
slave-skip-errors=1062
看:http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html