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