主从复制时的过滤有两种方式可以实现,一种是启动从库时添加对应的参数,一种是再从库运行时使用change replication filter 语句。
使用change replication filter与从库添加参数时的区别:
1/不需要重启,仅仅需要执行STOP/START SLAVE SQL_THREAD;
2/不能持久化,从库重启便会失效。
使用change replication filter
基本语句
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
过滤类型
- REPLICATE_DO_DB: 只复制指定的数据库 相当于在mysqld后面加 —replicate-do-db.
- REPLICATE_IGNORE_DB: 忽略指定的数据库 相当于在mysqld后面加 —replicate-ignore-db.
- REPLICATE_DO_TABLE: 只复制指定的表 相当于在mysqld后面加—replicate-do-table.
- REPLICATE_IGNORE_TABLE: 忽略指定的表 相当于在mysqld后面加 —replicate-ignore-table.
- REPLICATE_WILD_DO_TABLE: 使用通配符来指定要复制的表 相当于 —replicate-wild-do-table.
- REPLICATE_WILD_IGNORE_TABLE: 使用通配符来指定要忽略的表 相当于 —replicate-wild-ignore-table.
- REPLICATE_REWRITE_DB: 复制的时候,重命名库 相当于—replicate-rewrite-db.
基本用法
一次指定多个规则
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);相同的规则下,指定多次,只会最后一次生效 ```sql CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db3,db4);
3. 使用通配符,如果有特殊字符,如%,则需要加引号,其他的可以不加。
```sql
CHANGE REPLICATION FILTER
REPLICATE_WILD_DO_TABLE = ('db1.old%');
CHANGE REPLICATION FILTER
REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');
使用rewrite重命名库
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));清空规则
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
参考文档
https://dev.mysql.com/doc/refman/5.7/en/change-replication-filter.html
