Documentation Home

17.5.1.28 复制和源或副本关闭

关闭复制源服务器并稍后重新启动它是安全的。当副本失去与源的连接时,副本会立即尝试重新连接,如果失败则定期重试。默认设置是每 60 秒重试一次。这可能会随着CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或 CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)而改变。副本还能够处理网络连接中断。replica_net_timeout但是,只有在几秒或 slave_net_timeout几秒内没有从源接收到数据后,副本才会注意到网络中断 。如果您的中断时间很短,您可能希望降低 replica_net_timeout或 的值slave_net_timeout。看 第 17.4.2 节,“处理副本的意外停止”

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

干净地关闭副本是安全的,因为它会跟踪它停止的位置。但是,请注意副本没有打开临时表;参见 第 17.5.1.31 节,“复制和临时表”。不干净的关闭可能会产生问题,尤其是在问题发生之前磁盘缓存未刷新到磁盘的情况下:

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

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

如果你有一个好的不间断电源,你的系统对这些类型问题的容错能力会大大提高。