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 = TABLErelay_log_info_repository = TABLEselect sql_delay from mysql.slave_relay_log_info;c.如果没有设置relay_log_info_repository = table 则查看备库的relay-log日志:cat relay-log.info3.取消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都导入,延迟库除外