221_mysql_复制技术_过滤复制
十三 mysql server 过滤复制
Master上有数据变更,生成binlog 传给slave,slave是否执行取决于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;
- 点赞
- 收藏
- 关注作者
评论(0)