关闭复制源服务器并稍后重新启动它是安全的。当副本失去与源的连接时,副本会立即尝试重新连接,如果失败则定期重试。默认设置是每 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 不会导致强制写入磁盘,并且服务器依赖操作系统不时刷新文件。
如果你有一个好的不间断电源,你的系统对这些类型问题的容错能力会大大提高。