关闭复制源服务器并稍后重新启动是安全的。当副本失去与源的连接时,副本会立即尝试重新连接,如果失败,则会定期重试。默认情况下,每 60 秒重试一次。可以使用 CHANGE REPLICATION SOURCE TO
语句进行更改。副本还可以处理网络连接中断。但是,副本只有在从源接收不到数据超过 replica_net_timeout
秒后才会注意到网络中断。如果中断时间很短,您可能需要减小 replica_net_timeout
的值。请参阅 第 19.4.2 节,“处理副本意外停止”。
源端的不正常关闭(例如崩溃)会导致源的二进制日志的最终位置小于副本读取的最新位置,这是因为源的二进制日志文件没有被刷新。这会导致副本在源恢复后无法复制。在源服务器的 my.cnf
文件中设置 sync_binlog=1
有助于最大程度地减少此问题,因为它会导致源更频繁地刷新其二进制日志。为了在使用 InnoDB
进行事务的复制设置中获得最大的持久性和一致性,您还应该设置 innodb_flush_log_at_trx_commit=1
。使用此设置,InnoDB
重做日志缓冲区的内容将在每次事务提交时写入日志文件,日志文件将被刷新到磁盘。请注意,即使使用此设置,事务的持久性仍然无法保证,因为操作系统或磁盘硬件可能会告诉 mysqld 刷新到磁盘的操作已经完成,即使实际上没有完成。
干净地关闭副本是安全的,因为它会跟踪它停止的位置。但是,请注意,副本没有打开临时表;请参阅 第 19.5.1.31 节,“复制和临时表”。不正常关闭可能会产生问题,尤其是在问题发生之前磁盘缓存没有刷新到磁盘的情况下。
对于事务,副本先提交,然后更新
relay-log.info
。如果在这两个操作之间发生意外退出,中继日志处理将比信息文件指示的要远,并且副本在重新启动后将重新执行中继日志中最后事务的事件。如果副本更新了
relay-log.info
,但服务器主机在写入被刷新到磁盘之前崩溃,也会出现类似的问题。为了最大限度地减少这种情况发生的可能性,请在副本的my.cnf
文件中设置sync_relay_log_info=1
。将sync_relay_log_info
设置为0将导致不将任何写入强制到磁盘,并且服务器依赖于操作系统不时地刷新文件。
如果您拥有一个良好的不间断电源,则系统对这类问题的容错能力会大大提高。