1. 程式人生 > >MySQL 5.7在線設置復制過濾【轉】

MySQL 5.7在線設置復制過濾【轉】

line 調整 count 很大的 can mas 開啟 all repl

轉自

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/

MySQL 5.7在線設置復制過濾【轉】