很久沒有更新博客了,主要是公司事情比較多,最近終於閑下來了。然而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/