关闭复制源服务器并在以后重新启动是安全的。当副本丢失与源的连接时,副本会立即尝试重新连接,如果失败,则会定期重试。默认情况下,每 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.32 节,“复制和临时表”。不干净的关闭可能会产生问题,尤其是如果在问题发生之前未将磁盘缓存刷新到磁盘。
对于事务,副本先提交,然后更新
relay-log.info
。如果在这两个操作之间发生意外退出,中继日志处理将比信息文件指示的更进一步,并且副本在重新启动后将重新执行中继日志中最后事务的事件。如果副本更新了
relay-log.info
文件,但服务器主机在写入磁盘之前崩溃,也会出现类似的问题。为了最大程度地减少这种情况发生的可能性,请在副本的my.cnf
文件中设置sync_relay_log_info=1
。将sync_relay_log_info
设置为 0 会导致不将任何写入强制到磁盘,服务器将依赖操作系统不时地刷新文件。
如果您有一个良好的不间断电源,则系统针对此类问题的容错能力将大大提高。