1.做好数据库主备,然后在备库上执行:

mysql> stop slave;
mysql> change master to master_delay = N;
mysql> start slave;
其中N的单位是秒
2.查看复制延迟:
a.通过show slave status\G查看:
SQL_Delay: 30 表示延迟30s;
b.通过mysql.slave_relay_log_info表查看:
备库参数设置了:
master_info_repository = TABLE
relay_log_info_repository = TABLE
select sql_delay from mysql.slave_relay_log_info;
c.如果没有设置relay_log_info_repository = table 则查看备库的relay-log日志:
cat relay-log.info
3.取消relay延迟:
mysql> stop slave;
mysql> change master to master_delay = 0;
mysql> start slave;
4.设置了relay后重启slave后不需要重新指定delay时间,默认使用上一次指定的时间,在使用master_delay时,
io_thread会实时的把主库的日志拉到备库,只是在sql_relay时,sql_thread会延迟进行应用到备库上。
5.通过复制延迟来恢复误删除的数据:
在备库操作,确认误删除的数据还没有应用:
stop slave sql_thread;
mysqlbinlog --base64-output=decode-rows -v binlog.000059 查找到删除时候的日志并定位到具体的gtid,然后备库指定应用到删除时候的gtid:
start slave sql_thread until sql_before_gtids='08a7bcf7-a8e4-11e8-8b61-0800278f64de:438364';
设置跳过删除的事务:
stop slave;
set gtid_next='08a7bcf7-a8e4-11e8-8b61-0800278f64de:438364';
begin;
commit;
set gtid_next='AUTOMATIC';
start slave; 如果有多个事务,此处可以考虑只开始io_thread,继续按照上面的来跳过删除的事务;
最后导出被删除的数据,应用到主库上。
后续的备库处理:
a.主库导入数据后,延迟备库重新初始化,这样不影响其它备库;
b.手动删除相应的延迟库上的数据,启动slave进行应用,避免数据冲突;
c.在主库导入数据时,回话级别设置set session sql_log_bin = 0;进行导入,这样不记录日志,不会传输到备库;
注意:如果是多个slave情况下需要每个slave都导入,延迟库除外