版本和配置
MySQL: 5.7.22-log
binlog-format=ROW
slave_exec_mode=IDEMPOTENT
Master-Slave基于GTID的主从复制
Master-Slave实例包含库test_c、test_b、test_c
复制过滤参数
1 | --replicate-do-db |
参数说明可参考:http://dp.imysql.com:8080/node/58
Database-Level Replication 流程图
Table-Level Replication 流程图
测试
库级过滤
Slave配置过滤规则:replicate-do-db=test_a
DDL
CREATE/DROP TABLE
Master执行
1 | mysql> use test_b; |
Slave复制报错
1 | Last_SQL_Errno: 1051 |
查看master binlog信息
1 | mysql> show binlog events in 'mysql-bin.000004' from 1340; |
ALTER TABLE
Master执行
1 | mysql> use test_b; |
Slave复制正常
查看slave binlog信息
1 | mysql> show binlog events in 'mysql-bin.000012' from 2301; |
DML
Master执行
1 | mysql> use test_b; |
Slave复制正常
查看master binlog信息
1 | mysql> show binlog events in 'mysql-bin.000004' from 1893; |
表级过滤
Slave配置过滤规则:replicate-do-table=test_a.t
DDL
CREATE/DROP TABLE
Master执行
1 | mysql> use test_b; |
Slave复制正常
查看Slave的binlog信息
1 | mysql> mysql> show binlog events in 'mysql-bin.000012' from 1683; |
ALTER TABLE
Master执行
1 | mysql> use test_b |
Slave复制正常
查看Slave的binlog信息
1 | mysql> show binlog events in 'mysql-bin.000012'; |
DML
Master执行
1 | mysql> use test_b |
Slave复制正常
库表级规则混用
组合多,仅列举一种:do-db & do-table
Slave配置过滤规则:
replicate-do-db=test_a
replicate-do-table=test_a.t
DDL
CREATE/DROP TABLE
Master执行
1 | mysql> use test_b |
Slave复制报错
1 | Last_SQL_Errno: 1051 |
ALTER TABLE
Master执行
1 | mysql> use test_b |
Slave复制报错
1 | Last_SQL_Errno: 1091 |
DML
Master执行
1 | mysql> use test_b |
Slave复制正常
结论
- 当BINLOG以ROW格式记录执行语句时,复制过滤允许跨库执行语句,不以当前默认数据库(用USE语句指定)为主,当BINLOG以STATEMENT格式记录执行语句时,复制过滤以当前默认数据库(用USE语句指定)为主(不允许跨库),可参考上面两次DDL测试,注意:注只有DML语句可以使用ROW格式记录,DDL语句始终以STATEMENT形式记录
- 库表级别过滤混合使用时,当库级别检测不符合时会直接返回,不会再走到表级别判断,因此建议使用–replicate-wild-do-table=test_a.%来替换–replicate-do-db=test_a做库级过滤,可防止跨库的DDL(CREATE)操作导致Slave复制报错
参考