MySQL主从复制(3)复制过滤配置教程与跨库更新

TangLu MySQL 2021-03-15 5705 0

一、MySQL过滤复制介绍

当主库上存在多个业务数据库,但从库只需要同步一部分的话就需要用到MySQL的复制过滤功能。比如一个主库承载多个业务数据库,需要将不同业务数据库复制到不同的从库进行查询以做到业务隔离的场景。通过过滤复制可以灵活的指定哪些库和表需要复制,哪些库不需要同步,使用了复制过滤后,由于从库与主库数据是不完全一致的,所以从库不能进行高可用切换,如有相关需求需要额外准备一个完整的从库。通常建议在从服务器上配置过滤复制,一是主库配置复制过滤时只能进行库级别的过滤,而在从库上可以实现表级别的复制过滤复制。二是主从配置复制过滤后会减少binlog的内容,这样可能会对数据的一致性带来影响,而通过从库配置依然会接收主库完整的binlog,只是进行回放的时候会进行过滤。


二、MySQL过滤复制配置介绍

1、主库复制过滤相关配置(仅支持库级别过滤)

· binlog_do_db:白名单,只对指定数据库进行binlog记录与复制,多个数据库设置可以写多行

· binlog_ignore_db:黑名单,此选项中指定的数据库将不进行binlog记录和复制,多个数据库设置可以写多行

[mysqld]
...
binlog_do_db=linuxedb
binlog_do_db=bbsdb
...


2、从库复制过滤相关配置(支持表级别过滤)

· replicate_do_db:数据库白名单列表,多个数据库用逗号分隔,该选项指定的数据库会执行主从复制操作

· replicate_ignore_db:数据库黑名单列表,该选项指定的数据库将不会被复制

· replicate_do_table:表级别的白名单

· replicate_ignore_table:表级别的黑名单

· replicate_wild_do_table:可以使用通配符进行指定表,如%代表所有

· replicate_wild_ignore_table:同上

#从库添加以下配置,通过show slave status命令可以查看复制过滤相关配置是否生效
[mysqld]
...
replicate_wild_do_table=linuxe.%   #从库仅对linux这个库进行同步
...


3、从库动态调整复制过滤规则(不要忘记同步写进配置文件)

从MySQL 5.7开始支持CHANGE REPLICATION FILTER语句,可以动态对从库的复制过滤进行调整

mysql > stop slave sql_thread;  #必须先停止线程,否则后面语句会报错
mysql > change replication filter replicate_wild_do_table=('database1.%','database2.%')  #一并指定所有数据需要复制的库表,该命令是覆盖操作而不是新增
mysql > start slave sql_thread;


4、在已经运行了一段时间的复制拓扑中,如果复制过滤需求发生了变更,可以将主库所有数据同步到每个从库中,然后再每个从库中仅保留需要的数据库表即可


三、MySQL跨库更新问题

如果Master服务器开启了binlog_do_db、binlog_ignore_db,Slave服务器开启了replicate_do_db和replicate_ignore_db选项会有跨库更新不同步的问题。原因是当MySQL执行SQL语句时对当前数据库做检查,如果当前库没有在白名单里指定,那么就不会写入到二进制日志。示例:

1、首先在Master服务器上执行SQL语句

USE  test2;    #切换到另一个库
INSERT  INTO  test1.table1 VALUES(1.'zhangsan');   #对test1库做操作


2、到从服务器上查看发现并没有同步

SELCET  *  FROM  mysql1.table1


3、查看下Master的日志情况 

show  master  logs;    #查看日志记录情况
show  binlog  events  in  'master-bin.000003'    #发现没有那条INSERT语句


解决办法:

修改Slave的my.cnf配置文件,把replicate_do_db和replicate_ignore_db选项修改为replicate_wild_do_table和replicate_wild_ignore_table,使用表级别的主从复制不会受到跨库影响

replicate_wild_do_table=mysql1.%
replicate_wild_do_table=mysql2.%
replicate_wild_ignore_table=mysql3.%


评论