16.4.1.26 复制以及源或副本关闭

关闭源服务器并稍后重新启动是安全的。当副本失去与源的连接时,副本将尝试立即重新连接,并在失败时定期重试。默认值为每 60 秒重试一次。可以使用更改为主语句更改此设置。副本还能够处理网络 Connecting 断。但是,副本仅在slave_net_timeout秒内未从源接收到任何数据后,才注意到网络中断。如果您的中断时间很短,则可能需要减少slave_net_timeout。参见第 16.3.2 节“处理副本意外停止”

源端的异常关闭(例如,崩溃)可能会导致源二进制日志的最终位置小于副本服务器读取的最新位置,这是因为未刷新源二进制日志文件。这可能导致副本在源备份后无法复制。在源代码的my.cnf文件中设置sync_binlog=1可以最大程度地减少此问题,因为它会使源代码更频繁地刷新其二进制日志。为了在使用InnoDB进行事务的复制设置中获得最大的持久性和一致性,还应该设置innodb_flush_log_at_trx_commit=1。使用此设置,在每次事务提交时,InnoDB重做日志缓冲区的内容都会写到日志文件中,并且日志文件会刷新到磁盘。请注意,使用此设置仍不能保证事务的持久性,因为 os 或磁盘硬件可能会告诉mysqld刷新磁盘操作已经发生,即使尚未进行。

干净地关闭副本是安全的,因为它可以跟踪其保留的位置。但是,请注意副本没有打开临时 table。参见第 16.4.1.29 节,“复制 table 和临时 table”。不干净的关机可能会产生问题,尤其是如果在发生问题之前未将磁盘缓存刷新到磁盘时:

  • 对于事务,副本将提交,然后更新relay-log.info。如果这两个操作之间发生崩溃,则中继日志处理将比信息文件指示的进行得更远,并且副本将在重新启动后重新执行中继日志中最后一个事务的事件。

  • 如果副本更新relay-log.info,但在将写入刷新到磁盘之前服务器主机崩溃,则会发生类似的问题。为了最大程度地减少这种情况的发生,请在副本my.cnf文件中设置sync_relay_log_info=1。将sync_relay_log_info设置为 0 不会强制写入磁盘,并且服务器依赖 os 不时刷新文件。

如果您拥有良好的不间断电源,则针对这些类型问题的系统的容错能力将大大提高。