当 relay_log_purge=1时,旧relay logs会在SQL线程执行完毕后被自动删除
当 relay_log_purge=0 时,旧的 relay log 则会被保留。虽然这并不会影响从库复制本身,但还是会有坑:由于崩溃或停止 MySQL 时,SQL 线程可能没有执行完全部的 relay log,最后一个 relay log 中的一部分数据会被重新下载到新的文件中。也就是说,这部分数据重复了两次。如果 SQL 跟得很紧,则可能在 IO 线程写入 relay log ,但还没有将同步到磁盘时,就已经读取执行了。这时,就会造成新的文件和旧的文件中少了一段数据。
但是对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能以及定期清理的办法,从而避免对于清理过多过大的relay log需要注意引起的复制延迟资源开销等。
每个slave上设置了参数relay_log_purge=0,所以slave节点需要定期删除中继日志,建议每个slave节点删除中继日志的时间错开。
corntab -e
0 5 * * * /usr/bin/purge_relay_logs --user=system --password=123456 --port=3307 --disable_relay_log_purge >> /data/mysqldata/3307/purge_relay.log 2>&1
上文中加了参数 --workdir 指定创建relay log的硬链接的位置,默认是/var/tmp