【MySQL】MySQL 8.0从库延迟同步复制防止误删库

MySQL 5.6以上版本延迟复制配置,通过设置Slave上的master to master_delay参数实现:
change master to master_delay = N;
N为多少秒,该语句设置从数据库延时N秒后再与主数据库进行数据同步复制。


具体操作:
登陆到Slave数据库服务器

[root@localhost ~]# mysql -h127.0.0.1 -u root -p
mysql> stop slave;
change master to master_delay=600;
start slave;
mysql> show slave status \G;
查看SQL_Delay的值为600,表示设置成功。
注释:
SQL_Delay:一个非负整数,表示秒数,Slave滞后多少秒于Master。
SQL_Remaining_Delay:当Slave_SQL_Running_State等待,直到MASTER_DELAY秒后,Master执行的事件,
此字段包含一个整数,表示有多少秒左右的延迟。在其它时候,这个字段是NULL。

文件源自:https://www.jb51.net/article/179909.htm

https://blog.csdn.net/u010520724/article/details/108116831

 

MySQL 8.0延迟复制与部分复制

 

https://blog.csdn.net/wzy0623/article/details/90642712

MySQL使用延迟同步复制预防误操作

说明:本文所述内容都是是基于MySQL 5.5.x及MairaDB 10.0.x版本
  如果是MySQL 5.6及其以上版本可使用:CHANGE MASTER TO MASTER_DELAY = N;N为多少秒,该语句设置从数据库延时N秒后,再与主数据库进行数据同步复制。具体介绍详见 :MySQL 5.6 CHANGE MASTER语法。 

https://dev.mysql.com/doc/refman/5.6/en/change-master-to.html

  为了数据库安全,作为dba很多时候都绞尽脑汁进行各种控制权限,各种操作限制,但无论如何不管怎么控制,如果是DBA自己操作特别是drop table、truncate、delete等难免会出现失误的时候。也许你有备份,但是停机恢复不是什么公司都能承受的而且恢复起来也很不方便。所以,这里简单介绍通过MySQL“延迟复制”来为你数据库实现平滑的逻辑恢复。
1、MySQL 5.5.x版本如何实现“延迟复制”
使用的是percona-toolkit-2.2.5-1工具,如果还不清楚它,请点击:percona-toolkits介绍

https://www.percona.com/doc/percona-toolkit/2.2/index.html
用例:
/usr/bin/pt-slave-delay --user=${USER_NAME} --password=${PASS_WORD} --port=${PORT} --daemonize --interval=5m  --delay=8h --use-master 172.16.2.21(备库IP)
  上述表示每个5分钟检查slave是否需要启动或停止,Slave设置比Master延迟8小时,binlog点是以Master为标准,脚本以守护进程的方式在后台运行
当脚本检查复制延迟操过了设定的时间那么就会启动sql线程进行追赶知道延迟8小时则停止。
注:因为脚本每隔5分钟才检查一次复制情况所以实际延迟其实是8小时5分

 


2、如何使用”延迟复制“进行恢复
a) 主库操作如下(启用自动提交模式):
insert into t values(111);
insert into t values(222);
insert into t values(333);
start transaction;                                #开启一个事务,假如该事务是误操作
insert into t values(444); 
insert into t values(555);
commit;                                           #提交事务
insert into t values(666);

 

查看binlog日志:

 

mysql> show binlog events;                        #只查看第一个binlog文件的内容

 

mysql> show binlog events in 'mysql-bin.000002';  #查看指定binlog文件的内容

 

mysql> show binary logs;                          #获取binlog文件列表

 

mysql> show master status;                       #查看当前正在写入的binlog文件

 

 

 

b) 备库操作如下
start slave until master_log_file='mysql-bin.0000012',MASTER_LOG_POS = 872; 
告诉MySQL复制执行到master binlog
0000012 中end_log_pos为872的位置然后停止
然后查看:
MariaDB [test]> select * from t;

 

发现按照预期的结果复制
现在需要跳过 444,555两条记录故执行
stop slave;
set global sql_slave_skip_counter=1;
start slave;
show slave status \G 
说明已经执行了最后一个end_log_pos 1294。

 

查看表里的数据
MariaDB [test]> SELECT * FROM T;

 

成功跳过记录为444、555的插入操作。
PS:
关于这里set global sql_slave_skip_counter=1;需要多解释一下
  很多人认为该语句是跳过一条语句,这里其实是的分情况的: 一般来说(自动提交模式)每次执行一条插入或更新或删除操作,那么执行上述跳过语句可以认为是一次跳过一条语句,但是如果是使用start transaction(非自动提交模式)那么情况就不大一样了,这时的跳过是按照事物进行跳跃的。
参考:
http://dev.mysql.com/doc/refman/5.6/en/change-master-to.html
http://www.percona.com/doc/percona-toolkit/2.2/

 

posted @ 2021-05-25 21:08  ~*一生所爱*~  阅读(302)  评论(0编辑  收藏  举报
在国际交往中,实力 永远是维护正义的基础;国防 才是外交真正的后盾;尊严 只在剑峰之上;真理 只在大炮射程之内。