221_mysql_复制技术_过滤复制

举报
alexsully 发表于 2021/11/12 12:39:41 2021/11/12
【摘要】 过滤复制库/表级别

十三 mysql server 过滤复制

Master上有数据变更,生成binlog 传给slaveslave是否执行取决于slave自身配置是否忽略了该语句

  • 主库使用 –binlog-do-db & --binlog-ignore-db 配置哪些库的变更写binlog (主库不支持表级别写入)
  • 从库使用 –replicate change replicationfilter 语句设置复制过滤规则

13.1 从库复制过滤项的检查过程如下

slave执行接收到某个语句时

1 检查数据库级别的选项 –replicate-do-db –replicate-ignore-db

2 检查表级别的选项 –replicate-do-table; –replicate-wild-do-table; --replicate-ignore-table; --replicate-wild-ignore-table

 

5.6之前版本 同时配置–replicate-do-db –replicate-do-table 对于库级别是失效的(create database dbx 会被忽略)

同时建议 wild-do wild-ignore 不要混用

 

13.2库级别复制过滤选项评估

数据库级复制的过滤

通过--replicate-do-db--replicate-ignore-db控制哪些数据库的更改在从库上执行

首先根据binlog_format确定默认数据库,

对于STATEMENT格式的记录,默认数据库是使用USE指定的,

对于ROW格式的记录,默认数据库是更新的数据所在的库

1 查看是否存在--replicate-do-db选项,

如果存在,则默认数据库在--replicate-do-db中的更新会进行下一步表级别的过滤,不在其中的库不会在从库上更新。

 

2 查看是否存在--replicate-ignore-db选项,

如果存在,在默认数据库包括在--replicate-ignore-db中的更新不会在从库上执行,其他库的更新进行下一步表级别的过滤

--replicate-do-db--replicate-ignore-db同时存在时,--replicate-do-db的优先级更高,不在--replicate-do-db中的库不会在从库上复制。

binlog_format=ROW时,DML语句的默认数据库根据更新的内容自动获取,但是DDL语句的默认数据库需要通过USE指定

 

slave 不复制 master的 mysql,test库

slave 只复制 master的 A,B库所有操作

replicate-ignore-db=mysql

replicate-ignore-db=test

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate_do_DB=A

replicate_do_DB=B

replicate-wild-do-table=A.%

replicate-wild-do-table=B.%

13.3 表级别复制过滤选项的评估

表级复制的过滤

满足 1 找不到匹配数据库级别复制过滤项  2 找到匹配数据库级别复制最终进行表级过滤

通过--replicate-do-table--replicate-wild-do-table--replicate-ignore-table,--replicate-wild-ignore-table选项控制表级别的过滤

区别:

--replicate-do-table --replicate-ignore-table每次只能指定一个表,

指定多个表需要多次设置,示例:--replicate-do-table:channel_1:db_name.tbl_name

--replicate-wild-do-table和--replicate-wild-ignore-table 支持通配符,示例:--replicate-wild-do-table=foo%.bar%

是否存在表级别的过滤选项,如果没有,执行语句

如果存在表级别的过滤选项,按照以下顺序进行检查

--replicate-do-table

--replicate-ignore-table

--replicate-wild-do-table

--replicate-wild-ignore-table

13.4 复制过滤规则应用

例1 A库下 Alex表, B库下 bob 表
Replicate-ignore-db = A
Replicate-do-table = B.bob
Use alex;
Insert into B.bob  values (1)

Statement:use alex 使 Alex 称为默认数据库, --replicate-ignore-db 匹配成功,默认数据库内insert语句会被忽略,不检查表级别选项  
Row模式: 默认数据库对slave复制过滤配置选项没有影响,

5,7 新特性 change replication filter 支持从库动态配置复制过滤特性,需要重启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)

mysql> STOP SLAVE SQL_THREAD;
mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db2.t1%','db2.t2%');
mysql> STOP SLAVE SQL_THREAD; 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。