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

比如,下面只复制库名为db1和db2中的表:

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);

比如,下面同步db1.t1开头的表,过滤db1.t2开头的表

CHANGE REPLICATION FILTER

REPLICATE_WILD_DO_TABLE = ('db1.t1%'),

REPLICATE_WILD_IGNORE_TABLE = ('db1.t2%');

关于复制过滤,有几点需要额外注意:

(1)如果一个binlog事务里有多个SQL,其中涉及到过滤库名或者表名的SQL将被过滤,不涉及到的则仍然执行。举例如下:

比如主库执行:

begin;

insert into db1.tb1 values(1);

insert into db2.tb2 values(2);

commit;

从库设置

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

从库执行的事务变成如下:

begin;

insert into db2.tb2 values(2);

commit;

(2)如果事务中的所有SQL都是被过滤的,那么从库就会变成执行一个空事务。

比如主库执行:

begin;

insert into db1.tb1 values(1);

insert into db1.tb2 values(2);

commit;

从库设置

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1);

从库执行的事务变成如下:

begin;

commit;

(3)过滤是全局设置的,如果使用channel多通道复制,那么所有通道的复制过滤都是一样的。MySQL 8.0 对这个问题进行了改进,能够对某个通道单独指定复制过滤规则。

3. binlog_format为statement

对于binlog格式为statement时,过滤db的逻辑与row格式不太一样,判断sql是否属于某个db,与use db相关。比如下面这个例子,目的是想要将涉及db1的SQL不写入binlog,结果却与预想不一样。

设置:

--binlog-ignore-db=db1

执行SQL:

use db2;

update db1.tb set name='123' where id=1;

对db1中的表做了修改,该修改本来是想忽略,不记录binlog,但结果仍然记录在binlog里,原因就是use db2导致。

mysql 复制忽略库_MySQL主从复制过滤相关推荐

  1. mysql count忽略空_MySQL count 过滤空值,使其不将空数据计入条数

    首先,看如下两个查询语句: 第一种 SELECT t.id, t.meetStyle, t.title, count(p.id) AS personCount, count(f.id) AS file ...

  2. mysql主从复制与主主复制的对比_MySQL主从复制与主主复制

    mysql 的主从复制: 实验环境: linux CentOS7两台:192.168.230.10(主)----192.168.230.11(从)(系统安装好,关掉防火墙或配置好防火墙) mysql ...

  3. mysql主从注意事项_mysql主从复制亲测,以及注意事项

    本人亲测,windows作为mysql主服务器,linux作为从服务器,使用两个linux配置步骤都一样,测一遍而已:区别配置文件在于windwos是my.ini.linux在/etc/my.cof ...

  4. mysql主从配置原理_MySQL主从复制原理

    MySQL主从复制是构建高可用MySQL的基础,复制就是让一台服务器的数据和其它服务器保持同步,一台主库可以同步到多台备库上面,备库也可以作为另一台服务器的主库.主库和备库之间可以有多种不同的组合方式 ...

  5. mysql 未找到命令_MySQL主从复制配置说明,一文教你搞懂数据库主从复制

    一,MySQL主从配置原理 1. mysql支持的复制格式 基于语句复制(STATEMENT) (优点)基于statement复制的优点很明显,简单的记录执行语句同步到从库执行同样的语句,占用磁盘空间 ...

  6. mysql 复制数据文件_mysql数据库搬家,可以直接复制数据库文件吗

    诶?这项技术又是什么玩意(What)? 这项技术为什么会存在?我们已经有那么多解决方案(Method)了,我们为什么要用它(Why)? 如果这项技术那么好且我们正好有场景可以用到这项技术,且能使我们的 ...

  7. mysql 复制 二进制文件命令_Mysql中复制详细解析

    原标题:Mysql中复制详细解析 1.mysql复制概念 指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在复制服务器上将这些日志文件重新执行,从而使复制服务器和主服务器的数据保持 ...

  8. mysql主从有关参数_mysql主从复制配置

    一.mysql主从备份(复制)的基本原理 mysql支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.mysql复制基于主服务器在二进制日志中跟踪所有对数据库的 ...

  9. mysql主从 dump线程_MySQL主从复制线程状态转变

    一.主库线程状态(State)值 以下列表显示了主从复制中主服务器的Binlog Dump线程的State列中可能看到的最常见状态(SHOW PROCESSLIST).如果Binlog Dump线程在 ...

最新文章

  1. R语言广义线性模型Logistic回归模型列线图分析(nomogram)
  2. Easy ui 多表头 数据结构
  3. android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...
  4. Python入门100题 | 第011题
  5. Coursera课程Python for everyone:Quiz: Multi-Table Relational SQL
  6. webbench 代码阅读
  7. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_05-CMS需求分析-什么是CMS...
  8. c语言汇率转换代码_C语言人民币转换代码..doc
  9. VMware 8.0下载地址
  10. 红米note4android,红米Note4深度评测
  11. solidworks图纸模板添加_solidworks工程图模板制作教程(中)
  12. 计算机修理工具包价格,电脑修复工具包#200多个联想工程师专用电脑修复小工具打包...
  13. java简述什么是事务_java什么是事务意思概念
  14. 流放者柯南自建服务器 linux,流放者柯南自建服务器教程一览服务器搭建方法介绍...
  15. 关于跳跃连接 卷积网络
  16. Vue前端框架的使用
  17. 在PHP中怎么解决大量数据处理的问题
  18. writely is cool!
  19. 什么是外键? 为什么需要外键?怎么使用外键?
  20. 一文读懂物联网 MQTT 协议之实战篇

热门文章

  1. idea配置svn不成功
  2. 服务器上找不到iis,解答IIS服务器文件或目录未找到的问题
  3. 服务器 Unbuntu重启后,nvidia-smi 不能使用
  4. Vue源码解析(一)
  5. 老表:Java8尽管很香,你想过升级到Java11吗?会踩那些坑?
  6. 鼠标滚动放大缩小图片
  7. hmr webpack 不编译_Webpack hmr:__webpack_hmr 404找不到
  8. BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)
  9. 计算机的铃声怎么取消,怎样取消开机声音?四种方法任你选
  10. [Log4j基础]-- 缺少log4j包或包版本冲突报错