mysql延时复制

1.延迟复制

人为配置的,让从库延迟sql线程的回放动作

设置从库sql_thread延时回放,使得从库晚于主库执行;

1.1为什么从要延迟复制

删除数据时能更快恢复

主库删除后,让延迟的从库在误操作前的时间点停下,然后进行恢复

因为恢复全备恢复binlog往往会更加耗时

1.2延迟配置

开启延迟复制:

change master to master_delay=60;

master_delay的值默认为0,单位为秒,范围在[0,232-1],官方文档参考
一般建议1-6小时,根据反映时间稍作调整

#在配置主从时就可以加上,或者停止sql线程后在配置
#开启延迟复制:
stop slave sql_thread;
change master to master_delay=60;
start slave sql_thread;

#关闭延迟复制:
stop slave sql_thread;
change master to master_delay=0;
start slave sql_thread;

#8.0之后可以直接change master to master_delay=60;不用再重启sql线程

#查看状态
show slave status\G
......
                    SQL_Delay: 60
          SQL_Remaining_Delay: NULL
......

2.延迟复制恢复案例

有一主一从,从库延迟主库5分钟,主库误操作,删除了一个库

2.1恢复思路:

  1. 5分钟之内,知道了误删除操作
  2. 在延迟的5分钟之内,立即停止从库的sql线程
  3. 从库show slave status找到正在使用的relaylog(Relay_Log_File)和起点(Relay_Log_Pos)
  4. 从库show relaylog events in 'Relay_Log_File文件',找到删除语句的Pos点(终点)
  5. 截取起点和终点的relaylog日志,恢复到从库
  6. 将从库作为主库,替代主库工作

2.2故障模拟和恢复

1.主库进行数据操作

create database db_test;
use db_test;
create table t1(id int);
insert into t1 values(1),(2),(3);
drop database db_test;

2.从库在延迟时间内停止sql线程

stop slave sql_thread;

3.找到并截取relaylog的起点和终点

#找起点
show slave status\G
......
Relay_Log_File: localhost-relay-bin.000004
Relay_Log_Pos: 517
......
#起点517和使用的relaylog文件localhost-relay-bin.000004

------------------------------------------------------------------------------

#找终点
show relaylog events in 'localhost-relay-bin.000004';
······
Log_name                   | Pos  | Event_type     | Server_id | End_log_pos | Info
localhost-relay-bin.000004 | 1211 | Query          |         1 |        1099 | drop database db_test
······

#终点在1211

------------------------------------------------------------------------------


#截取relaylog
#--skip-gtids 这个参数避免的幂等性,就是告诉GTID不要检查历史事务了,直接操作就行了
#幂等性,比如说恢复GTID的1-5号事务,检查自己发现有1-5号事务,重复冲突,就不操作了。
#--skip-gtids不保留主库的gtid,把它当做新的事务执行
#如果没有使用--skip-gtids,到恢复的时候,可能导致gtid号冲突而失败


mysqlbinlog --start-position=517 --stop-position=1211  /data/mysqldata/localhost-relay-bin.000004>/tmp/relay.sql

------------------------------------------------------------------------------

#从库上恢复binlog
set sql_log_bin=0;
source /tmp/relay.sql;
set sql_log_bin=1;

#如果从库也开启了binlog,注意binlog重复,先不写binlog,确认无误之后再写入binlog

4.解除从库身份

stop slave;
reset slave all;    #清空relaylog,重新生成初始的

#后续重新构建主从
#或是将丢失的数据恢复到原先的主库
posted @ 2021-08-25 16:48  EverEternity  阅读(216)  评论(0编辑  收藏  举报