2013年12月11日 星期三 10:43
我在办公区中部署了一台MySQL数据库,作为线上生产环境的辅库,目的是作为异地备份以及方便程序员查询一些数据。
办公区的供电稳定性远不及IDC,三天两头断电,每次断电后,MySQL的数据库都无法正常启动复制,原因是出现了Duplicate Key的错误。只能手工跳过这些错误,以便让能够复制继续进行。不久,就有程序员反馈说这台数据库的数据和线上数据库有差异。
我研究了一下,办公区这台MySQL数据库是5.6版本,sync_master_info和sync_relay_log_info参数均设置为0,master_info_repository和relay_log_info_repository参数均设置为FILE。这样的设置在服务器断电的情况下,必然会导致复制出现问题,因为master.info和relay-log.info文件没有及时被刷新保存到磁盘,当服务器发生断电重启后,这两个文件的信息落后于数据库,所以会有部分binlog中的语句被重复执行,从而出现之前所说的Duplicate Key的错误。
在MySQL 5.6版本中,对于复制系统的Crash-Safe有很大的改进。我们只需要设置如下两个参数,即可实现Crash-Safe的复制:
relay_log_info_repository = TABLE
relay_log_recovery = ON
这两个参数设置的含义是:
将relay_log的信息记录到数据表(InnoDB存储引擎,mysql.slave_relay_log_info),并且将更新此表的操作作为事务的一部分来执行,这就保证 对数据的更新 与 对relay_log的更新 保持一致。如果提交则全部提交,如果回滚和全部回滚。
当MySQL发生的复制系统重启时,IO线程将根据mysql.slave_relay_log_info数据表中的信息 来从主库拉取binlog数据。
更权威的讨论请参考:
http://www.mysqlperformanceblog.com/2013/09/13/enabling-crash-safe-slaves-with-mysql-5-6/
Zeuux © 2024
京ICP备05028076号