MySQL主从复制过滤
MySQL主从复制是逻辑复制,基于Binlog进行主从数据传输,MySQL提供了丰富的参数来配置主从复制过滤条件。在主库可以设置对于库的数据写入是否写入binlog,在从库可以设置对某些库或者表的binlog是否忽略。本文将简单描述MySQL主从复制过滤的相关参数和常见用法。
- MySQL版本:5.7.19
- binlog_format:ROW
1. 是否写入binlog
MySQL通过以下两个参数来控制某些库是否写入binlog。
- --binlog-do-db=db_name
- --binlog-ignore-db=db_name
--binlog-do-db 指定的库名,其内部表数据修改都会写入binlog。
--binlog-ignore-db 指定的库名,其内部表数据修改将不会写入binlog。
这两个参数修改需要重启MySQL,无法动态修改,另外在show global variables 的结果中也无法显示这两个参数。
2. SQL线程过滤日志
从库复制的SQL线程从relay log里读日志,并应用日志,通过设置如下参数,可以控制SQL线程根据库名或表名过滤日志。
- --replicate-ignore-db=db_name
- --replicate-ignore-table=db_name.tbl_name
- --replicate-do-db=db_name
- --replicate-do-table=db_name.tbl_name
- --replicate-wild-do-table=db_name.tbl_name
- --replicate-wild-ignore-table=db_name.tbl_name
- --replicate-rewrite-db=from_name->to_name
--replicate-ignore-db 忽略某些库的binlog 日志应用。
--replicate-ignore-table 忽略某些表的binlog 日志应用。
--replicate-do-db 应用某些库的binlog 日志。
--replicate-do-table 应用某些表的binlog 日志。
--replicate-wild-do-table 使用通配符来匹配那些应用binlog日志的表。
--replicate-wild-ignore-table 使用通配符来匹配那些不能应用binlog日志的表。
--replicate-rewrite-db,能够实现主库与从库数据库名称不同的复制,比如主库数据库名为A,从库数据库名为B,实现主库A到从库B的复制。
以上这些参数同样不能动态修改,需要重启MySQL生效。在show global variables 的结果中也无法显示这些参数。
动态设置过滤条件:
MySQL提供了另外一种动态设置从库的复制过滤条件的方式,CHANGE REPLICATION FILTER 语法,设置前先停止复制的SQL线程,设置完成后,再开启SQL线程。具体语法如下:
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