zoukankan      html  css  js  c++  java
  • 【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/

  • 相关阅读:
    磁盘挂载自动分区脚本
    docker的私有仓库的搭建
    centos6上安装docker
    docker的本地仓库换成阿里云的镜像仓库
    python中的coding的格式书写形式
    mysql5.6的二进制包安装
    mysql忘记root密码
    Verilog利用$fdisplay命令往文件中写入数据
    Quartus和ISE调用Synplify进行综合的问题
    TMS320C6455 SRIO 实现方案
  • 原文地址:https://www.cnblogs.com/OrcinusOrca/p/14808204.html
Copyright © 2011-2022 走看看