replication 中通過以下參數減少binlog數據量
一、master端:
--binlog-do-db 二進制日志記錄的數據庫(多數據庫用逗號,隔開),盡量不要使用。 --binlog-ignore-db 二進制日志中忽略數據庫 (多數據庫用逗號,隔開),盡量不使用。
以下是mysql主從忽略授權表的方法案例: in master:
[mysqld] binlog-do-db=YYY 需要同步的數據庫。不添加這行表示同步所有 binlog-ignore-db = mysql 這是不記錄binlog,來達到從庫不同步mysql庫,以確保各自權限 binlog-ignore-db = performance_schema binlog-ignore-db = information_schema
二、slave端
[mysqld]
--replication-do-db 設定需要復制的數據庫(多數據庫使用逗號,隔開),盡量不使用。 --replication-ignore-db 設定需要忽略的復制數據庫 (多數據庫使用逗號,隔開),盡量不使用。 --replication-do-table 設定需要復制的表,盡量不使用。 --replication-ignore-table 設定需要忽略的復制表,盡量不使用。 --replication-wild-do-table 同replication-do-table功能一樣,但是可以通配符,最佳使用。 --replication-wild-ignore-table 同replication-ignore-table功能一樣,但是可以加通配符,最佳使用,但與--replication-wild-do-table盡量不同時使用。
# 盡量使用--replication-wild-do-table和--replication-wild-ignore-table,但不宜兩者同時使用,而是使用這兩者之一即可。
auto@10.10.10.20((none)) > show slave status\G *************************** 1. row *************************** Slave_IO_State: Queueing master event to the relay log Master_Host: 10.10.10.10 Master_User: mysqlsync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.009129 Read_Master_Log_Pos: 394218960 Relay_Log_File: relay-bin.000256 Relay_Log_Pos: 126295006 Relay_Master_Log_File: mysql-bin.009129 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: analysis.property_define,analysis.define,analysis.property Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 126294801 Relay_Log_Space: 394219401 Until_Condition: Master Until_Log_File: mysql-bin.009161 Until_Log_Pos: 224619836 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 157399 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 175511070 Master_UUID: 99bacfbb-518b-11ea-af0c-34b35428066b Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Reading event from the relay log Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) Sat Jun 6 10:33:18 2020 auto@10.10.10.10((none)) ####################################### # 如上所示:Replicate_Wild_Do_Table: analysis.property_define,analysis.define,analysis.property # 表示該從庫只同步analysis數據庫的3張表:property_define,define,property # 如上圖所示: Until_Condition: Master Until_Log_File: mysql-bin.009161 Until_Log_Pos: 224619836 # 這三者表示該從庫執行了:start slave sql_thread until master_log_file='mysql-bin.009161',master_log_pos=224619836;
三、在線配置復制過濾
在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 REPLICATE_IGNORE_DB=(db1,db2); CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(db1.t1); CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE=(db2.t2); CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('db.t%'); CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE=('db%.a%'); CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=((from_db, to_db));
change replication filter replicate_wild_do_table=('sentry.%','hive.%','mysql.%');
13.4.2.2更改復制過濾器語句 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 CHANGE REPLICATION FILTER設置從服務器上的一個或多個復制過濾規則,方法與使用復制過濾選項(例如 或) 啟動從服務器mysqld相同。
與使用服務器選項的情況不同,此語句不需要重新啟動服務器即可生效,只需要先使用從SQL線程停止(然后再使用SQL線程 重新啟動 )即可。
需要 特權。
--replicate-do-db
--replicate-wild-ignore-table
STOP SLAVE SQL_THREAD
START SLAVE SQL_THREAD
CHANGE REPLICATION FILTER SUPER 注意 無法在為組復制配置的MySQL服務器實例上設置復制過濾器,因為在某些服務器上過濾事務將使該組無法就一致狀態達成協議。 以下列表顯示了CHANGE REPLICATION FILTER選項及其與 --replicate-*服務器選項的關系: REPLICATE_DO_DB:包括基於數據庫名稱的更新。等同於 --replicate-do-db。 REPLICATE_IGNORE_DB:根據數據庫名稱排除更新。等同於 --replicate-ignore-db。 REPLICATE_DO_TABLE:包括基於表名的更新。等同於 --replicate-do-table。 REPLICATE_IGNORE_TABLE:根據表名排除更新。等同於 --replicate-ignore-table。 REPLICATE_WILD_DO_TABLE:包括基於通配符模式匹配表名稱的更新。等同於 --replicate-wild-do-table。 REPLICATE_WILD_IGNORE_TABLE:排除基於通配符模式匹配表名稱的更新。等同於 --replicate-wild-ignore-table。 REPLICATE_REWRITE_DB:在從屬服務器上用新名稱替換主服務器上的指定數據庫后,對從屬服務器執行更新。等同於 --replicate-rewrite-db。 REPLICATE_DO_DB和 REPLICATE_IGNORE_DB過濾器 的確切效果取決於是基於語句的復制還是基於行的復制。有關更多信息,請參見第16.2.5節“服務器如何評估復制過濾規則”。 CHANGE REPLICATION FILTER通過用逗號分隔 規則,可以在單個語句中創建多個復制過濾規則 ,如下所示: CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2); 發出剛剛顯示的語句等同於使用選項 啟動從屬mysqld。 --replicate-do-db=d1 --replicate-ignore-db=d2 如果多次指定同一過濾規則,則實際上僅使用 最后一個這樣的規則。例如,此處顯示的兩個語句具有完全相同的效果,因為REPLICATE_DO_DB 忽略了第一條語句中的第一條規則: CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4); CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db3,db4); 警告 此行為與--replicate-*過濾器選項的行為不同,后者 多次指定同一選項會導致創建多個過濾器規則。 表和數據庫的名稱不包含任何特殊字符,無需引用。與REPLICATION_WILD_TABLE和 REPLICATION_WILD_IGNORE_TABLE一起使用的值 是字符串表達式,可能包含(特殊)通配符,因此必須加引號。在以下示例語句中顯示了這一點: CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.old%'); CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%'); 與一起使用的值REPLICATE_REWRITE_DB 表示成對的數據庫名稱。每個此類值都必須用括號括起來。以下語句db1將在主數據庫db2上發生的語句重寫為從數據庫上的 語句 : CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2)); 剛剛顯示的語句包含兩組括號,一組包含一對數據庫名稱,另一組包含整個列表。這也許是更容易看到在下面的例子中,它創建了兩個 rewrite-db規則,一個重寫的數據庫 dbA來dbB,和一個重寫數據庫dbC到 dbD: CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD)); 該語句使所有現有的復制過濾規則保持不變;要取消設置給定類型的所有過濾器,請將過濾器的值設置為一個明確為空的列表,如本示例所示,該列表將刪除所有現有 規則REPLICATE_DO_DB和 REPLICATE_IGNORE_DB規則: CHANGE REPLICATION FILTER REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = (); 以這種方式將過濾器設置為空會刪除所有現有規則,不會創建任何新規則,也不會還原使用--replicate-* 命令行或配置文件中的選項在mysqld啟動時設置的任何規則。 REPLICATE_WILD_DO_TABLE 和REPLICATE_WILD_IGNORE_TABLE一起 使用的值必須采用格式 。在MySQL 5.7.5之前,這不是嚴格執行的,盡管在這些選項中使用不一致的值可能會導致錯誤的結果(錯誤#18095449)。 db_name.tbl_name
四、配置文件中配置復制過濾
############################
my.cnf配置文件中配置
############################
[mysqld] replicate-wild-do-table=miui_log_sdk.%
replicate-wild-do-table=model.user
replicate-wild-do-table=model.log
replicate-wild-do-table=mysql.%
replicate-wild-do-table=dba_metadata.%
replicate-wild-do-table=skill_store.%
#############################
2. 在線配置復制過濾 ############################
> stop slave; > reset slave all;
> reset master;
> change master to master_host='10.10.10.10',master_port=3306,master_user='mysqlsync',master_password='123456', master_log_file='mysql-bin.000001',master_log_pos=150;
> change replication filter replicate_wild_do_table=('dba_metadata.%','model.user','model.log','miui_log_sdk.%','mysql.%');
> start slave;
復制過濾選項
常常看見很多同學在主庫進行過濾選項設置,當然這也有好處,減少了帶寬,但是在主庫設置過濾選項是非常危險的操作,因為無論是顯示要過濾的或者要同步的,二進制日志只記錄你設置的,其他的是不會記錄的。當主庫有數據需要用到binlog恢復時,你就准備哭吧。所以通常在備庫進行過濾選項設置。比如忽略某個庫,同步所有庫,或者同步某一個庫,當然這會浪費帶寬,但是和安全比起來,這點浪費不算什么。有時候安全與性能往往需要我們自己平衡。
還有就是跨庫更新,如果我們在備庫是這樣設置的,比如同步yayun這個庫
replicate_do_db=yayun
主庫記錄如下:
mysql> select * from t1; +----+-------+ | id | name | +----+-------+ | 1 | yayun | | 2 | atlas | | 3 | mysql | +----+-------+ 3 rows in set (0.00 sec) mysql>
備庫記錄如下:
mysql> select * from t1; +----+-------+ | id | name | +----+-------+ | 1 | yayun | | 2 | atlas | | 3 | mysql | +----+-------+ 3 rows in set (0.00 sec) mysql>
現在我們在主庫插入一條記錄
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into yayun.t1 (name) values ('good yayun');
Query OK, 1 row affected (0.01 sec)
mysql> select * from yayun.t1;
+----+------------+
| id | name |
+----+------------+
| 1 | yayun |
| 2 | atlas |
| 3 | mysql |
| 5 | good yayun |
+----+------------+
4 rows in set (0.00 sec)
mysql>
查看備庫:
mysql> select * from t1; +----+-------+ | id | name | +----+-------+ | 1 | yayun | | 2 | atlas | | 3 | mysql | +----+-------+ 3 rows in set (0.00 sec) mysql>
怎么回事?怎么沒有同步?這就是跨庫更新帶來的問題,比如下面的更新:
use test
insert into yayun.t1 (name) values ('good yayun')
當然你會說哪個2B會這么干啊,呵呵,有時2B還是有的。所以我們還有另外2個過濾復制參數
replicate_wild_do_table replicate_wild_ignore_table
一個是要同步的表,一個是不同步的表,通常我們可以這樣寫
replicate_wild_do_table=yayun.%
表示同步yayun庫下面的所有表,這樣就解決的跨庫更新的問題。
復制格式的問題
通常推薦使用ROW格式,為什么使用?看看我前面文章MySQL數據恢復和復制對InnoDB鎖機制的影響
不要用Seconds_Behind_Master來衡量MySQL主備的延遲時間
這個后續我會寫相關文章解釋為什么不要用該參數衡量主備的延遲時間。
復制過濾的坑:
那就是當你的從庫宕機后,無法開機了,這個時候,你配置的復制過濾規則也就沒了,因此,這就需要保存復制過濾的配置,才能萬無一失
########################
####################################

