mysql如何線上修改主從複製選項
前言:
MySQL最常用的架構就是主從複製了,其實主從複製有很多選項,特別是在從庫端,我們可以設定複製過濾,比如說忽略某張表或某個庫。這些過濾選項都是可以線上修改而不用重啟的。原來對這塊瞭解不多,最近看了下相關資料,個人覺得這個功能還是很方便的,本篇文章會將這塊內容分享給大家。
1.複製過濾引數介紹
首先我們要了解設定複製過濾的不同引數。複製過濾是在從庫端設定的,可以只複製某些庫或某些表,也可以忽略複製某些庫或某些表。這些都是由不同引數控制的,下面簡單介紹下不同引數的作用。
- REPLICATE_DO_DB:指定只同步某個庫的資料
- REPLICATE_IGNORE_DB:忽略某個庫的同步
- REPLICATE_DO_TABLE:指定同步某個表
- REPLICATE_IGNORE_TABLE:忽略某個表的同步
- REPLICATE_WILD_DO_TABLE:指定同步某些表,可以用萬用字元
- REPLICATE_WILD_IGNORE_TABLE:忽略某些表的同步,可以用萬用字元
- REPLICATE_REWRITE_DB:從庫端替換庫名
這些複製過濾引數還是很好理解的,只看名字就能大概瞭解該引數的作用。預設情況下,這些引數是都沒有設定的,開啟主從複製後從庫端會默認同步全部從主庫發來的資料。
2.修改複製過濾選項
當我們想臨時調整從庫的複製策略時,可以設定上述引數。我們可以將過濾引數寫入配置檔案然後重啟從庫即可應用,但這種方法需要重啟例項,不做推薦。MySQL5.7版本可以進行線上設定複製過濾了。但是還是得停複製,不過不用重啟例項了,方便進行臨時性的調整。主要用到的是CHANGE REPLICATION FILTER語句,下面就簡單的測試一下:
# 預設未設定複製過濾 mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.3.16 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000004 Read_Master_Log_Pos: 35198 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 910 Relay_Master_Log_File: binlog.000004 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: 35198 # 設定忽略db1庫的複製 mysql> STOP SLAVE SQL_THREAD; Query OK,0 rows affected (0.00 sec) mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1); Query OK,0 rows affected (0.00 sec) mysql> START SLAVE SQL_THREAD; Query OK,0 rows affected (0.01 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.3.16 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000004 Read_Master_Log_Pos: 35198 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 910 Relay_Master_Log_File: binlog.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: db1 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: 35198 # 主庫建立db1測試從庫是否同步 mysql> CREATE DATABASE `db1` DEFAULT CHARACTER SET utf8; Query OK,1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | mysql | | performance_schema | | sys | | testdb | +--------------------+ 6 rows in set (0.00 sec) # 檢視從庫狀態 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testdb | +--------------------+ 5 rows in set (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.3.16 Master_User: repl Master_Port: 33061 Connect_Retry: 60 Master_Log_File: binlog.000004 Read_Master_Log_Pos: 35383 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 1095 Relay_Master_Log_File: binlog.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: db1 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: 35383 # 取消複製過濾引數 mysql> STOP SLAVE SQL_THREAD; Query OK,0 rows affected (0.01 sec) mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (); Query OK,0 rows affected (0.01 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.3.16 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000004 Read_Master_Log_Pos: 35383 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 1095 Relay_Master_Log_File: binlog.000004 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: 35383
上面我們簡單演示了下使用CHANGE REPLICATION FILTER語句線上修改複製過濾選項的方法,列舉的那些過濾引數都可以使用該語句修改,不過要注意有些選項是互斥的。應該按照實際需求去設定合適的引數,下面給出官方文件中的示範語法:
CHANGE REPLICATION FILTER filter[,filter][,...] filter: REPLICATE_DO_DB = (db_list) | REPLICATE_IGNORE_DB = (db_list) | REPLICATE_DO_TABLE = (tbl_list) | REPLICATE_IGNORE_TABLE = (tbl_list) | REPLICATE_WILD_DO_TABLE = (wild_tbl_list) | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list) | REPLICATE_REWRITE_DB = (db_pair_list) db_list: db_name[,db_name][,...] tbl_list: db_name.table_name[,db_table_name][,...] wild_tbl_list: 'db_pattern.table_pattern'[,'db_pattern.table_pattern'][,...] db_pair_list: (db_pair)[,(db_pair)][,...] db_pair: from_db,to_db
總結:
本篇文章介紹瞭如何線上更改複製過濾選項的方法,不同的過濾引數有不同的用途,如果你確實有需求要設定過濾引數,建議一定要進行全面測試,某些引數設定後可能影響到其他庫表的複製。如果想永久生效,可以線上修改後再加入配置檔案內,這樣從庫重啟後還是生效的。
以上就是mysql如何線上修改主從複製選項的詳細內容,更多關於mysql修改主從複製的資料請關注我們其它相關文章!