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/
MySQL 5.7在線設置復制過濾【轉】