MySQL Replay(非 GTID)
非 GTID 情况
1 切换前置检查
1.1 设置只读
执行 "SET GLOBAL READ_ONLY=1";
1.2 检查是否本地回放完成
slave_status.master_log_file == slave_status.relay_master_log_file
同时
slave_status.read_master_log_pos == slave_status.exec_master_log_pos
1.3 停止 slave io_thread
执行 "STOP SLAVE IO_THREAD";
4.4 授权 Grant replication privileges for slaves
4.5 返回切换辅助信息
4.5.1 检查逻辑
(1)日志类型判断:
如果 binlog 和 relay log 都不存在,直接返回失败(
NO_LOGS_FIND
)。如果 只有 relay log,优先从 relay log 查找。
如果 只有 binlog,优先从 binlog 查找。
如果 两者都存在,进入复杂逻辑(需结合心跳值和节点历史角色判断)。
(2) 心跳值校验(NOT_SURE
分支):
调用
MySQLMgr::GetHeartbeatValue
获取心跳表中的最新进度值(value
)。根据
has_master_before
决定 优先检查 binlog 还是 relay log:曾是主库:先查 binlog(要求 checkpoint 必须与心跳值一致),再查 relay log。
曾是从库:先查 relay log(要求 checkpoint ≥ 心跳值),再查 binlog。
如果两者均未找到匹配的 checkpoint,返回失败。
(3) 结果返回:
通过
use_binlog
返回实际使用的日志类型。返回
0
(成功)或-1
(失败)。
4.5.2 binlog 和 relay log 格式
Load binlogs num: 20, relay logs num: 39
主从复制:
从库的
relay-log.info
文件记录:relay_log_file = relay-log.000001 relay_log_pos = 1234 master_log_file = binlog.000005 master_log_pos = 5678
表示从库已应用到
relay-log.000001
的 1234 位置,对应主库的binlog.000005
的 5678 位置。
GTID 模式(全局事务标识符):
使用
gtid_executed
变量记录已应用的事务 ID 集合,替代文件 + position。
Last updated