复制过滤器的作用是让从节点仅复制指定的数据库,或指定数据库的指定表。
有如下两种实现方式:
-
方式一:主服务器仅向二进制日志中记录与特定数据库(或特定表)相关的事件;
-
方式二:从服务器 SQL 线程在 replay 中继日志中的事件时,仅读取与特定数据库(或特定表)相关的事件并应用于本地;
这两种方式各有利弊:
-
方式一方式更节省空间,但如果未备份的库或表出现故障,八成就无法完整恢复了,所以不推荐使用;
-
方式二方式会造成网络带宽、磁盘 I/O、以及存储空间额外的浪费,不过相对来说更安全,因为备份的数据多嘛;
这两种方式可通过如下参数进行配置:
方式一:
binlog_do_db:数据库白名单列表,即仅记录此处指定的数据库的 binlog 日志;
binlog_ignore_db:数据库黑名单列表,即仅不记录此处指定的数据库的 binlog 日志;
方式二:
replicate_do_db:数据库白名单,即仅读取此处指定的数据库的 relay 日志;
replicate_ignore_db:数据库黑名单,即仅不读取此处指定的数据库的 relay 日志;
replicate_do_table:数据表白名单,即仅读取此处指定的表的 relay 日志;
replicate_ignore_table:数据库黑名单,即仅不读取此处指定的表的 relay 日志;
replicate_wild_do_table:作用同 replicate_do_table,但它支持以 % 作为通配符匹配表名;
replicate_wild_ignore_table:作用同 replicate_ignore_table,但它支持以 % 作为通配符匹配表名;
很清晰易懂,直接在 my.cnf
中配置即可,就不演示了~~~
除了可以在 my.cnf
中配置外,从库的 replicate_*
配置配置还可在线修改,语法格式如下:
CHANGE REPLICATION FILTER filter[, filter][, ...]
比如要修改仅读取 db1
、db2
库的 relay 日志,则可执行如下语句:
mysql> STOP SLAVE SQL_THREAD;
mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB = (oldguo, oldboy);
mysql> START SLAVE SQL_THREAD;
具体用法可通过 help replication filter
查看。
评论区