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恢复思路:
- 5分钟之内,知道了误删除操作
- 在延迟的5分钟之内,立即停止从库的sql线程
- 从库show slave status找到正在使用的relaylog(Relay_Log_File)和起点(Relay_Log_Pos)
- 从库show relaylog events in 'Relay_Log_File文件',找到删除语句的Pos点(终点)
- 截取起点和终点的relaylog日志,恢复到从库
- 将从库作为主库,替代主库工作
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,重新生成初始的
#后续重新构建主从
#或是将丢失的数据恢复到原先的主库