MySQL主從復(fù)制過濾

MySQL主從復(fù)制是邏輯復(fù)制,基于Binlog進(jìn)行主從數(shù)據(jù)傳輸,MySQL提供了豐富的參數(shù)來配置主從復(fù)制過濾條件。在主庫(kù)可以設(shè)置對(duì)于庫(kù)的數(shù)據(jù)寫入是否寫入binlog,在從庫(kù)可以設(shè)置對(duì)某些庫(kù)或者表的binlog是否忽略。本文將簡(jiǎn)單描述MySQL主從復(fù)制過濾的相關(guān)參數(shù)和常見用法。

原文地址:
https://mytecdb.com/blogDetail.php?id=88

  • MySQL版本:5.7.19
  • binlog_format:ROW

1. 是否寫入binlog

MySQL通過以下兩個(gè)參數(shù)來控制某些庫(kù)是否寫入binlog。

  • --binlog-do-db=db_name
  • --binlog-ignore-db=db_name

--binlog-do-db 指定的庫(kù)名,其內(nèi)部表數(shù)據(jù)修改都會(huì)寫入binlog。
--binlog-ignore-db 指定的庫(kù)名,其內(nèi)部表數(shù)據(jù)修改將不會(huì)寫入binlog。

這兩個(gè)參數(shù)修改需要重啟MySQL,無法動(dòng)態(tài)修改,另外在show global variables 的結(jié)果中也無法顯示這兩個(gè)參數(shù)。

2. SQL線程過濾日志

從庫(kù)復(fù)制的SQL線程從relay log里讀日志,并應(yīng)用日志,通過設(shè)置如下參數(shù),可以控制SQL線程根據(jù)庫(kù)名或表名過濾日志。

  • --replicate-ignore-db=db_name
  • --replicate-ignore-table=db_name.tbl_name
  • --replicate-do-db=db_name
  • --replicate-do-table=db_name.tbl_name
  • --replicate-wild-do-table=db_name.tbl_name
  • --replicate-wild-ignore-table=db_name.tbl_name
  • --replicate-rewrite-db=from_name->to_name

--replicate-ignore-db 忽略某些庫(kù)的binlog 日志應(yīng)用。
--replicate-ignore-table 忽略某些表的binlog 日志應(yīng)用。
--replicate-do-db 應(yīng)用某些庫(kù)的binlog 日志。
--replicate-do-table 應(yīng)用某些表的binlog 日志。
--replicate-wild-do-table 使用通配符來匹配那些應(yīng)用binlog日志的表。
--replicate-wild-ignore-table 使用通配符來匹配那些不能應(yīng)用binlog日志的表。
--replicate-rewrite-db,能夠?qū)崿F(xiàn)主庫(kù)與從庫(kù)數(shù)據(jù)庫(kù)名稱不同的復(fù)制,比如主庫(kù)數(shù)據(jù)庫(kù)名為A,從庫(kù)數(shù)據(jù)庫(kù)名為B,實(shí)現(xiàn)主庫(kù)A到從庫(kù)B的復(fù)制。

以上這些參數(shù)同樣不能動(dòng)態(tài)修改,需要重啟MySQL生效。在show global variables 的結(jié)果中也無法顯示這些參數(shù)。

動(dòng)態(tài)設(shè)置過濾條件:

MySQL提供了另外一種動(dòng)態(tài)設(shè)置從庫(kù)的復(fù)制過濾條件的方式,CHANGE REPLICATION FILTER 語(yǔ)法,設(shè)置前先停止復(fù)制的SQL線程,設(shè)置完成后,再開啟SQL線程。具體語(yǔ)法如下:

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

比如,下面只復(fù)制庫(kù)名為db1和db2中的表:
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);

比如,下面同步db1.t1開頭的表,過濾db1.t2開頭的表
CHANGE REPLICATION FILTER
REPLICATE_WILD_DO_TABLE = ('db1.t1%'),
REPLICATE_WILD_IGNORE_TABLE = ('db1.t2%');

關(guān)于復(fù)制過濾,有幾點(diǎn)需要額外注意:

(1)如果一個(gè)binlog事務(wù)里有多個(gè)SQL,其中涉及到過濾庫(kù)名或者表名的SQL將被過濾,不涉及到的則仍然執(zhí)行。舉例如下:

比如主庫(kù)執(zhí)行:
begin;
insert into db1.tb1 values(1);
insert into db2.tb2 values(2);
commit;

從庫(kù)設(shè)置
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

從庫(kù)執(zhí)行的事務(wù)變成如下:
begin;
insert into db2.tb2 values(2);
commit;

(2)如果事務(wù)中的所有SQL都是被過濾的,那么從庫(kù)就會(huì)變成執(zhí)行一個(gè)空事務(wù)。

比如主庫(kù)執(zhí)行:
begin;
insert into db1.tb1 values(1);
insert into db1.tb2 values(2);
commit;

從庫(kù)設(shè)置
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

從庫(kù)執(zhí)行的事務(wù)變成如下:
begin;
commit;

(3)過濾是全局設(shè)置的,如果使用channel多通道復(fù)制,那么所有通道的復(fù)制過濾都是一樣的。MySQL 8.0 對(duì)這個(gè)問題進(jìn)行了改進(jìn),能夠?qū)δ硞€(gè)通道單獨(dú)指定復(fù)制過濾規(guī)則。

3. binlog_format為statement

對(duì)于binlog格式為statement時(shí),過濾db的邏輯與row格式不太一樣,判斷sql是否屬于某個(gè)db,與use db相關(guān)。比如下面這個(gè)例子,目的是想要將涉及db1的SQL不寫入binlog,結(jié)果卻與預(yù)想不一樣。

設(shè)置:
--binlog-ignore-db=db1

執(zhí)行SQL:
use db2;
update db1.tb set name='123' where id=1;

對(duì)db1中的表做了修改,該修改本來是想忽略,不記錄binlog,但結(jié)果仍然記錄在binlog里,原因就是use db2導(dǎo)致。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • atom自帶的UI主題都不怎么好看,可以自己裝一些 之后選擇自己安裝的theme就可以了 感覺都不怎么好看!
    鴨梨山大哎閱讀 1,875評(píng)論 0 1
  • https://blog.csdn.net/guangli_r/article/details/70168131 ...
    dopami閱讀 2,531評(píng)論 0 1
  • 有時(shí)內(nèi)在的痛苦來的太多,自己都不清晰是被哪個(gè)內(nèi)在小孩掌控!有時(shí)會(huì)掉入幻想的陷阱里!讓你找不到方向! ...
    孤獨(dú)的綻放閱讀 122評(píng)論 0 1

友情鏈接更多精彩內(nèi)容