主从复制时的过滤有两种方式可以实现,一种是启动从库时添加对应的参数,一种是再从库运行时使用change replication filter 语句。
使用change replication filter与从库添加参数时的区别:
1/不需要重启,仅仅需要执行STOP/START SLAVE SQL_THREAD;
2/不能持久化,从库重启便会失效。

使用change replication filter

基本语句

  1. CHANGE REPLICATION FILTER filter[, filter][, ...]
  2. filter: {
  3. REPLICATE_DO_DB = (db_list)
  4. | REPLICATE_IGNORE_DB = (db_list)
  5. | REPLICATE_DO_TABLE = (tbl_list)
  6. | REPLICATE_IGNORE_TABLE = (tbl_list)
  7. | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  8. | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  9. | REPLICATE_REWRITE_DB = (db_pair_list)
  10. }
  11. db_list:
  12. db_name[, db_name][, ...]
  13. tbl_list:
  14. db_name.table_name[, db_table_name][, ...]
  15. wild_tbl_list:
  16. 'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]
  17. db_pair_list:
  18. (db_pair)[, (db_pair)][, ...]
  19. db_pair:
  20. 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.

基本用法

  1. 一次指定多个规则

    CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);
    
  2. 相同的规则下,指定多次,只会最后一次生效 ```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%');
  1. 使用rewrite重命名库

    CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));
    
  2. 清空规则

    CHANGE REPLICATION FILTER
     REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
    

参考文档

https://dev.mysql.com/doc/refman/5.7/en/change-replication-filter.html