从库重启后,通常不需要重新复制主库的全部数据,然后再开启复制。MySQL 的主从复制机制设计了优雅的恢复流程,可以在从库重启后继续从上次中断的位置继续复制,前提是相关的日志和状态信息完整。
以下是详细解释:
从库重启后的复制行为
-
记录复制进度
- 在主从复制中,从库会记录主库的 binlog 文件名和位置(通过
relay_log
和master_info_repository
等机制)。这些信息存储在从库的master.info
文件或系统表中(取决于配置)。 - 当从库重启后,它会读取这些记录,知道上次复制到主库的哪个位置。
- 在主从复制中,从库会记录主库的 binlog 文件名和位置(通过
-
继续复制流程
- 从库重启后,I/O 线程会根据记录的主库 binlog 位置,从主库获取后续的 binlog 事件。
- SQL 线程会继续从 relay log 中读取并执行未完成的更新操作。
是否需要重新同步数据
-
通常不需要重新同步:只要从库的 relay log 和相关的状态信息完整,从库可以从中断的位置继续复制。
-
可能需要重新同步的场景:
- 如果 relay log 文件被意外删除或损坏。
- 如果从库的复制进度记录丢失或损坏。
- 如果主库的 binlog 文件被清理(主库的
expire_logs_days
参数导致旧日志被删除)。
确保复制正常恢复的操作
-
检查复制状态
-
在从库重启后,执行
SHOW SLAVE STATUS\G
,查看以下关键字段:Slave_IO_Running
和Slave_SQL_Running
应该都为Yes
。Seconds_Behind_Master
表示从库落后主库的时间,逐渐减少表示复制正常进行。
-
-
验证数据一致性
- 使用工具(如
pt-table-checksum
)检查主从数据一致性。
- 使用工具(如
-
配置自动恢复
- 确保
relay_log_recovery = ON
,这样从库在重启后会尝试从主库的最新位置重新开始复制。
- 确保
重新同步数据的步骤(如果需要)
如果从库的数据或日志损坏,可能需要重新同步数据:
-
停止从库复制
STOP SLAVE;
-
删除旧的 relay log 文件
RESET SLAVE;
-
从主库获取新的备份
- 使用工具(如
mysqldump
或物理备份工具)获取主库的最新数据。
- 使用工具(如
-
重新配置复制
- 执行
CHANGE MASTER TO
指令,重新指定主库的 binlog 文件和位置。
- 执行
总结
- 通常不需要重新同步:从库会自动从中断的位置继续复制。
- 在特殊情况下(如日志损坏)可能需要重新同步:此时需手动干预,重新备份主库数据并配置复制。