MySQL主从复制过滤

MySQL主从复制是逻辑复制,基于Binlog进行主从数据传输,MySQL提供了丰富的参数来配置主从复制过滤条件。在主库可以设置对于库的数据写入是否写入binlog,在从库可以设置对某些库或者表的binlog是否忽略。本文将简单描述MySQL主从复制过滤的相关参数和常见用法。

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

  • MySQL版本:5.7.19
  • binlog_format:ROW

1. 是否写入binlog

MySQL通过以下两个参数来控制某些库是否写入binlog。

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

--binlog-do-db 指定的库名,其内部表数据修改都会写入binlog。
--binlog-ignore-db 指定的库名,其内部表数据修改将不会写入binlog。

这两个参数修改需要重启MySQL,无法动态修改,另外在show global variables 的结果中也无法显示这两个参数。

2. SQL线程过滤日志

从库复制的SQL线程从relay log里读日志,并应用日志,通过设置如下参数,可以控制SQL线程根据库名或表名过滤日志。

  • --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 忽略某些库的binlog 日志应用。
--replicate-ignore-table 忽略某些表的binlog 日志应用。
--replicate-do-db 应用某些库的binlog 日志。
--replicate-do-table 应用某些表的binlog 日志。
--replicate-wild-do-table 使用通配符来匹配那些应用binlog日志的表。
--replicate-wild-ignore-table 使用通配符来匹配那些不能应用binlog日志的表。
--replicate-rewrite-db,能够实现主库与从库数据库名称不同的复制,比如主库数据库名为A,从库数据库名为B,实现主库A到从库B的复制。

以上这些参数同样不能动态修改,需要重启MySQL生效。在show global variables 的结果中也无法显示这些参数。

动态设置过滤条件:

MySQL提供了另外一种动态设置从库的复制过滤条件的方式,CHANGE REPLICATION FILTER 语法,设置前先停止复制的SQL线程,设置完成后,再开启SQL线程。具体语法如下:

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

比如,下面只复制库名为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%');

关于复制过滤,有几点需要额外注意:

(1)如果一个binlog事务里有多个SQL,其中涉及到过滤库名或者表名的SQL将被过滤,不涉及到的则仍然执行。举例如下:

比如主库执行:
begin;
insert into db1.tb1 values(1);
insert into db2.tb2 values(2);
commit;

从库设置
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

从库执行的事务变成如下:
begin;
insert into db2.tb2 values(2);
commit;

(2)如果事务中的所有SQL都是被过滤的,那么从库就会变成执行一个空事务。

比如主库执行:
begin;
insert into db1.tb1 values(1);
insert into db1.tb2 values(2);
commit;

从库设置
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

从库执行的事务变成如下:
begin;
commit;

(3)过滤是全局设置的,如果使用channel多通道复制,那么所有通道的复制过滤都是一样的。MySQL 8.0 对这个问题进行了改进,能够对某个通道单独指定复制过滤规则。

3. binlog_format为statement

对于binlog格式为statement时,过滤db的逻辑与row格式不太一样,判断sql是否属于某个db,与use db相关。比如下面这个例子,目的是想要将涉及db1的SQL不写入binlog,结果却与预想不一样。

设置:
--binlog-ignore-db=db1

执行SQL:
use db2;
update db1.tb set name='123' where id=1;

对db1中的表做了修改,该修改本来是想忽略,不记录binlog,但结果仍然记录在binlog里,原因就是use db2导致。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • atom自带的UI主题都不怎么好看,可以自己装一些 之后选择自己安装的theme就可以了 感觉都不怎么好看!
    鸭梨山大哎阅读 1,669评论 0 1
  • https://blog.csdn.net/guangli_r/article/details/70168131 ...
    dopami阅读 2,384评论 0 1
  • 有时内在的痛苦来的太多,自己都不清晰是被哪个内在小孩掌控!有时会掉入幻想的陷阱里!让你找不到方向! ...
    孤独的绽放阅读 98评论 0 1