37|备库服务器异常重启,备库损坏了该如何修复?
俊达
你好,我是俊达。
上一讲中,我留了几个问题,就是备库异常崩溃后,复制位点信息是否会丢失?备库重新启动后,复制能不能正常运行?位点信息如果有延迟,对备库有什么影响?这些问题实际上和一些复制参数的设置有关,也和是否使用了 GTID Auto Position、是否开启了多线程复制有关。
复制位点信息的存储
我们先来看一下复制过程中会涉及到哪些位点,以及这些位点是怎么更新的。
备库复制的大致流程:
IO 线程从主库接收 Binlog,写到 RelayLog,在 Master Info 中记录读取主库的 Binlog 位点(master_log_name,master_log_pos)。参数 sync_source_info 用来控制 master info 的刷新频率。
SQL 线程从 Relay Log 中解析 Binlog 事件。读取的位点信息记录在 Relay Log Info 中。事务提交后,SQL 线程会更新 Relay Log Info。如果是单线程复制,事务提交时,会同步修改 Relay Log Info。如果使用了多线程复制,SQL 线程会在执行 GAQ Checkpoint 时更新 Relay Log Info。(Relay_log_name,Relay_log_pos)指向下一个待执行的事务,如果使用了多线程复制,那么这个位点有可能会比备库上已经提交的事务的位点更老。
a–如果开启了多线程复制,SQL 线程将 Binlog 分发给 Worker 线程,由 Worker 线程来执行。同一个事务的 Binlog 事件会分发给同一个 worker 线程。b–如果没有启用多线程复制,SQL 线程会直接执行 Binlog 事件。
每个 Worker 线程都有各自的事件队列,Worker 线程从各自的队列中获取 Binlog 事件。
Worker 线程提交事务时,同步更新 slave worker Info。worker Info 中以位图的形式记录了各个 worker 线程提交的事务。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
0/2000
1. 备库异常重启后,存储位点信息的方式对数据一致性和恢复过程至关重要,建议将参数master_info_repository和relay_log_info_repository都设置为table,将位点存储到innodb表中。
2. 在备库异常重启后,使用GTID Auto Position可以简化恢复过程,可以手动执行reset replica、change replication source命令进行修复。
3. MTS恢复逻辑是备库重启时进行的重要步骤,包括从slave_relay_log_info和slave_worker_info读取位点信息,统计事务数,以及根据位图recovery_groups跳过已提交的事务。
4. 在备库异常重启后,GTID的持久化是保障数据复制正常进行的关键,MySQL会将GTID持久化到mysql.gtid_executed表中,确保备库重启后能够初始化gtid_executed变量。
5. 备库异常重启后,使用GTID Auto Position或者手动执行reset replica、change replication source命令进行修复,可以解决Relay Log损坏的问题。
6. 备库异常重启后,如果没有开启GTID但使用了多线程复制,存在的风险是无法准确确定哪些事务已经提交,解决方法需要考虑如何确定已提交的事务。
7. 备库异常重启后,使用单线程复制时,relay_log_recovery设置为ON,备库重启时可以找到正确位点复制数据,但需要注意积压的Relay Log和主库的Binlog的一致性。
8. 备库异常重启后,多线程复制的恢复过程更加复杂,需要考虑到各个worker线程提交的事务和GAQ队列的管理,以及GTID的使用对恢复过程的影响。
9. 在备库异常重启后,建议使用GTID Auto Position来简化恢复过程,确保数据复制正常进行。
10. 备库异常重启后,保证relay log不损坏的方法可以是开启GTID Auto Position,避免影响备库恢复。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。