MySQL 5.7在线设置复制过滤【转】

转自

MySQL 5.7在线设置复制过滤 - yayun - 博客园 https://www.cnblogs.com/gomysql/p/4991197.html

5.7也GA了,有许多新的特性,其中现在可以进行在线设置复制过滤了。但是还是得停复制,不过不用重启实例了。方便了DBA们进行临时性的调整。下面就简单的测试一下。MySQL 5.7的安装有了很大的变化,我主要是安装的二进制版本。关于如何安装以及如何搭建好复制这种小事,相信聪明的你可以很快搞定。安装请参考http://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

下面进行复制过滤设置测试。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1902

可以看见现在并没有复制过滤的设置,现在进行调整。设置只同步db1,db2这2个库。
使用命令很简单:CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);
ERROR 3017 (HY000): This operation cannot be performed with a running slave sql thread; run STOP SLAVE SQL_THREAD first
mysql> 

可以看见提示要先停止SQL线程。那就先停止SQL线程。

mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);
Query OK, 0 rows affected (0.00 sec)

成功执行,我们再看看复制状态:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: db1,db2
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0

可以看见已经成功设置只同步db1,db2库,设置完成开启SQL线程就完事。

那么我们要是又要全部的库都要同步该如何操作呢,也很简单。

mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();
Query OK, 0 rows affected (0.00 sec)

mysql> start SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table: 

可以看见又没有过滤了。又全部同步所有的库了。重点命令就是

CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();

我们同样可以可以设置只同步某个库下面的某张表,或者不同步某个库下面的某张表。看命令。

mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE REPLICATION FILTER
    -> REPLICATE_WILD_DO_TABLE = (‘db1.t1%‘),
    -> REPLICATE_WILD_IGNORE_TABLE =  (‘db1.t2%‘);
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table: db1.t1%
  Replicate_Wild_Ignore_Table: db1.t2%

可以看见我已经设置同步db1下面以t1开头的表。忽略了db1下面t2开头的表。
重点的命令就是:

CHANGE REPLICATION FILTER
REPLICATE_WILD_DO_TABLE = (‘db1.t1%‘),
REPLICATE_WILD_IGNORE_TABLE =  (‘db1.t2%‘);

如果我们要设置同时同步1个库下面的某些表可以这样写:

mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE REPLICATION FILTER
    -> REPLICATE_WILD_DO_TABLE = (‘db2.t1%‘,‘db2.t2%‘);
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table: db2.t1%,db2.t2%

可以看到已经成功设置。

如果我们这样写是不生效的。会以最后一个表为准:

mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE REPLICATION FILTER
    -> REPLICATE_WILD_DO_TABLE = (‘db2.t1%‘),
    -> REPLICATE_WILD_DO_TABLE =  (‘db2.t2%‘);
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.69.25.173
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1902
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 2068
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table: db2.t2%

可以看到只有db2下面的t2开头的表生效了。

参考资料:

https://www.percona.com/blog/2015/11/04/mysql-5-7-change-replication-filter-online/

原文地址:https://www.cnblogs.com/paul8339/p/8309459.html

时间: 2024-11-08 23:47:21

MySQL 5.7在线设置复制过滤【转】的相关文章

MySQL 5.5主从关于‘复制过滤’的深入探究

关于MySQL主从复制的过滤,例如通过binlog-ignore-db.replicate-do-db.replicate-wild-do-table等.如果不好好研究过这些过滤选项就用的话,是有可能造成主从数据不一致问题的.本文将参考MySQL-5.5官方文档并结合实验,和各位一起探讨下这里的各个设置. 以下内容参考5.5官方文档 binlog_format的设置会导致一些复制执行上的差异. 格式有三种(STATEMENT,ROW,MIXED,5.5默认为STATEMENT) 当使用MIXED

MySQL5.7 设置同步复制过滤不用重启mysql服务进程了

在MySQL5.5/5.6里版本里,设置同步复制过滤,例如设置忽略掉test库的t2表,你需要在my.cnf配置文件里增加: replicate-ignore-table=test.t2 必须重启mysql服务进程才能生效. 在MySQL5.7里,通过一个新的命令,可以支持在线动态修改,而不须重启mysql进程就生效. Example: CHANGE REPLICATION FILTER REPLICATE_DO_DB=(db1,db2); CHANGE REPLICATION FILTER R

MariaDB(MySQL):半同步复制+ssl+复制过滤

一.半同步复制   1.mysql的复制 通过记录主服务器的二进制日志,并在从服务器上进行重放(replay)完成复制,默认都是异步进行的. 2.半同步复制 半同步复制是google贡献给MySQL的一个补丁,在MySQL 5.5之后就支持了,MariaDB都是支持的. MySQL的插件,一般在MySQL安装目录下; 半同步复制插件默认没有启用,需要自己安装,/usr/local/mysql/lib/plugin可以看到semisync_master.so和semisync_slave.so和其

mysql半同步复制及复制过滤

配置mysql半同步,前提是已经有master和slave环境. MySQL半同步配置 Master配置 安装semisync_master插件 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.02 sec) mysql>show plugins; +----------------------------+----------+------

mysql 5.7主从库复制设置

1.创建复制用户 CREATE USER 'rep_user'@'%.192.168.0.106' IDENTIFIED BY '123456'; 2.权限授予 GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%.192.168.0.106'; 3.备份主库 C:\Users\Administrator>mysqldump -uroot --password --databases test01 >e:/temp/2 0170507/aa.sql E

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

Linux运维 第四阶段 (七)MySQL REPLICATION(主从复制.半同步复制.复制过滤) 一.MySQL Replication相关概念: 1.复制的作用:辅助实现备份:高可用HA:异地容灾:分摊负载(scaleout):rw-spliting(mysql proxy工作在应用层). 2.master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写:slave比master要慢:master-slave默认异步方式传送. 3.半同步:仅负责最近一台slave同步成功,其它

MySQL-5.5 主从关于复制过滤的深入探究

之前也用过不同形式的'复制过滤'条件,例如binlog-ignore-db.replicate-do-db.replicate-wild-do-table等.没出问题,所以也没太深究这几个选项.最近用pt-table-checksum做例行检查的时候,发现主从竟然有不一样的块,惊出一身冷汗之余,照着官方文档配合实验好好整理了下. 以下内容参考5.5官方文档 binlog_format(STATEMENT,ROW,MIXED,5.5默认为STATEMENT)的设置会导致一些复制执行上的差异. 当使

MySQL学习笔记13分组复制相关概念

本文主要内容如下:1.分组复制产生的背景2.几种复制技术的比较3.失效检测4.组成员5.故障容忍度6.成员的节点状态7.分组复制的两种模式8.供体节点 1.分组复制产生的背景 多个MySQL服务组成的普通的复制体系存在必须的维护管理工作.MySQL分组复制技术使用MySQL组内通信协议提供了如下的好处: (1)提供组内的MySQL服务之间的自动化协调. (2)支持单个Primary体系或者多个Primary体系的分组. (3)单个Primary体系的分组支持自动化的Primary选举. (4)多

Mysql主从数据库架构的复制原理及配置详解

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收