通过延迟从库恢复主库误删表
如果公司有条件的话,或者是数据库数据量比较大,备份时间比较长。可以配置一个延迟从库,代替备份。这样恢复ddl的数据,就不用通过备份+binlog进行拉取了。
模拟故障,环境: 主从,从配置延迟复制。
配置3600s的延迟从库
stop slave; change master to master_delay = 3600; start slave;
主库drop表
use test;
drop table t1;
如果发现主库出现误操作,第一时间关闭从库sql_thread
stop slave sql_thread;
主库解析binlog,找到关键字DROP TABLE 相关的那条日志
/usr/local/mysql/bin/mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000050 > /tmp/1.log
# at 43456042 #190918 14:34:39 server id 1753333 end_log_pos 43456103 GTID last_committed=26452 sequence_number=26453 rbr_only=no SET @@SESSION.GTID_NEXT= '44b68395-ca31-11e9-b10a-00163e3211a2:443813'/*!*/; # at 43456103 #190918 14:34:39 server id 1753333 end_log_pos 43456214 Query thread_id=73858 exec_time=0 error_code=0 SET TIMESTAMP=1568788479/*!*/; DROP TABLE `t1` /* generated by server */ /*!*/;
从库开启复制,until到drop之前的事务
change master to master_delay = 3600;
start slave until sql_before_gtids = '44b68395-ca31-11e9-b10a-00163e3211a2:443813';
然后从库将该表dump出来,导入到主库中。
然后从库重启一下同步
stop slave; change master to master_delay = 3600; start slave;