19.5.1.28 复制 and Source or Replica Shutdowns
可以安全地关闭复制源服务器并在后重新启动。当副本与源失去连接,副本将立即尝试重新连接,如果失败则每60秒重试。这可以使用CHANGE REPLICATION SOURCE TO
语句进行更改。副本也可以处理网络连接中断。然而,副本只能在从源接收到无数据后才注意到网络中断,时间为replica_net_timeout
秒。如果您的中断时间短,您可能想减少replica_net_timeout
的值。请参阅第19.4.2节,“处理副本意外中断”。
源端的非干净关闭(例如崩溃)可能会导致源的二进制日志文件的最后位置小于副本最近一次读取的位置,因为源的二进制日志文件未被刷新。这可能会导致副本在源恢复后无法复制。将sync_binlog=1
设置在源服务器的my.cnf
文件中可以帮助减少这个问题,因为它会使源服务器更频繁地刷新二进制日志文件。为了在使用InnoDB
事务时获得最高的可靠性和一致性,您也应该设置innodb_flush_log_at_trx_commit=1
。这将在每个事务提交时将InnoDB
redo日志缓冲区的内容写入到日志文件,并将日志文件刷新到磁盘。请注意,即使设置了这项设置,事务的可靠性仍然不能保证,因为操作系统或磁盘硬件可能会告诉mysqld该刷新到磁盘操作已经完成,即使实际上没有。
关闭副本时保持干净是安全的,因为副本会跟踪它离开的位置。然而,请注意副本不应打开临时表;请参阅第19.5.1.31节,“复制和临时表”。非干净关闭可能会产生问题,特别是如果磁盘缓存在问题发生前未被刷新到磁盘:
-
对于事务,副本将提交事务,然后更新
relay-log.info
。如果在这两个操作之间出现意外退出,relay log处理将继续执行到最后一个事务在relay log中的位置,并在副本重新启动后重新执行最后一个事务在relay log中的事件。 -
类似的问题也可能会出现,如果复制服务器更新了
relay-log.info
文件,但服务器主机在写操作完成前崩溃。为了减少这种情况的可能性,请在复制服务器的my.cnf
文件中设置sync_relay_log_info=1
。将sync_relay_log_info
设置为0将不会强制写入磁盘,服务器将依赖操作系统定期刷新文件。
如果您有一个好的无中断电源供应,系统对这些问题的容错性将大大增加。