MySQL 5.5主从关于‘复制过滤’的深入探究
关于MySQL主从复制的过滤,例如通过binlog-ignore-db、replicate-do-db、replicate-wild-do-table等。如果不好好研究过这些过滤选项就用的话,是有可能造成主从数据不一致问题的。本文将参考MySQL-5.5官方文档并结合实验,和各位一起探讨下这里的各个设置。
以下内容参考5.5官方文档
binlog_format的设置会导致一些复制执行上的差异。
格式有三种(STATEMENT,ROW,MIXED,5.5默认为STATEMENT)
当使用MIXED格式时,binlog绝大多数情况也是以STATEMENT格式记录,只有在下列情况下才会切换到ROW格式:
1、 当时用UUID()函数时
2、 当一个或多个拥有AUTO_INCREMENT列的表被更新同时有‘trigger’或者‘stored function’被调用时
# MIXED对于‘trigger’和‘stored function’总是使用statement-based
3、 执行INSERT DELAYED时
4、 当视图里的某一部分需要row-based复制(例如UUID())时,创建该视图的语句被改为row-based
5、 使用用户自定义函数(UDF)时
6、 当某语句被判定为row-based,并且执行它的session需要用到临时表,则session下的所有子语句都将以ROW格式记录
7、 当使用USER(),CURRENT_USER()或者 CURRENT_USER
8、 当语句引用了一个或多个system variables。
9、 当使用LOAD_FILE()
下面几点要注意
1.所有DDL语句都是基于statements,不论binlog_format如何设置
2.复制双方binlog_format需一致,否则复制无法进行
3.Binlog格式影响到以下‘复制过滤’配置的行为
| --binlog-do-db --binlog-ignore-db=ljk #黑名单,这个库的修改不记录二进制日志。 该选项的行为取决于binlog格式 对于Statement-based logging:当use ljk后(即当前库为ljk时),所有的语句不被记录进binlog 当登陆mysql后不使用use或者use ljk之外的库,执行update ljk.table 依然会记录近binlog并复制[只对ljk库生效] 对于Row-based format:告诉服务器不记录任何ljk库下表的更改,无论当前在哪个库(即无论有无use语句,是否使用use ljk) |
| --replicate-do-db = ljk #白名单,允许复制哪个库 该选项的行为取决于binlog格式 对于Statement-based replication:只有主库在use ljk 之后执行的语句才会被从库复制,没有用use语句或者use其他库后执行的语句均不被复制 对于Row-based replication:只有ljk库的更改会被复制(无论use哪个库或者是否use) |
总结:Statement-based跟当前use的库有关,Row-based更直接,只关心指定的库‘做或不做’。
还有以下两种参数可‘过滤复制’
以下两种选项只对表的更改有影响,库的复制不受这些参数影响(但是类似ljk.%这种,也会对库起作用)
|
--replicate-do-table 这两个选项在我的实验里跟描述不太一致,详细见下文实验结果 --replicate-ignore-table |
| --replicate-wild-do-table = ljk.% >>>>严格限定复制 无论use ljk或use 其他库或不use,对ljk库的更新都能被复制,同时,其他任何库在任何情况下均不会复制(包括建库建表操作) --replicate-wild-ignore-table |
根据以上,综合建议:对复制的过滤,采用replicate-wild-do-table/ replicate-wild-ignore-table,比较严格和明确
下面是实验过程(MySQL-5.5.39)
一、 主库添加“binlog-ignore-db = mysql”,从库不加过滤
|
库操作: 在kai数据库执行建表操作: 对表内容修改: 对mysql库进行更改: |
总结:对于主库使用binlog-ignore-db来说:只有在use db执行后才会生效
二、从库添加“replicate-ignore-db = mysql”,主库不加过滤
|
库操作 在kai数据库执行建表操作 对表内容修改: 对mysql库进行更改 |
总结对于从库设定replicate-ignore-db 来说,基本上只有在主库使用use db时才会生效。
三、从库添加“replicate-ignore-table = mysql.%”,主库不加过滤
|
注:这条规则加完在任何库下执行任何语句均复制;相反,在从库添加replicate-do-table = mysql.%后,在任何库下执行任何sql都不会被复制。不知道是不是bug 库操作: 在kai数据库执行建表操作 对表内容修改: 对mysql库进行更改 |
总结:好像有bug,应该来说在use db后,并在对应的库下创建表应该会忽略同步。
四、 从库添加“replicate-wild-ignore-table = mysql.%”,主库不加过滤
|
库操作: 在kai数据库执行建表操作 对表内容修改: 对mysql库进行更改 |
总结:使用replicate-wild-ignore-table之后,所有对于mysql库下的表级别的任何操作都被忽略同步
综上参考官方文档以及实验,可得出结论:
对于每一个添加的‘复制过滤’配置,应从两方面考虑:
1. 不用use语句引用库,或者use xxx引用其他库之后再执行sql(又分两部分:对‘过滤的库/表’ 或 ‘对其他库/表’)会怎样
2. use xxx引用‘过滤的库/表’,再执行sql(也分两部分:对‘过滤的库/表’ 或 ‘对其他库/表’)会怎样
除replicate-wild-do-table=/replicate-wild-ignore-table=外,其他过滤规则会受到“binlog_format”以及“当前所在库”的影响(即所谓的跨库问题)
| 建议使用 replicate-wild-ignore-table=mysql.% 因为replicate-ignore-db 是通过use db来确定是否过滤的。 而wild-ignore是通过真实被修改的表进行过滤的,更为准确。 |
实验也验证了上文提到的“对复制的过滤,采用replicate-wild-do-table/ replicate-wild-ignore-table,比较严格和明确”
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-10/124181.htm
MySQL 5.5主从关于‘复制过滤’的深入探究的更多相关文章
- MySQL 5.7在线设置复制过滤【转】
转自 MySQL 5.7在线设置复制过滤 - yayun - 博客园 https://www.cnblogs.com/gomysql/p/4991197.html 5.7也GA了,有许多新的特性,其中 ...
- MySQL数据库的主从同步复制配置
一.主从同步机制原理 MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态), ...
- MySQL(mariadb)主从复制模式与复制过滤
在前一篇文章<mysql多实例与复制应用>中只对mysql的复制做了简单的介绍,本篇内容专门介绍一下mysql的复制. MySQL复制 mysql复制是指将主数据库的DDL和DML操作通过 ...
- MySQL 5.7在线设置复制过滤
很久没有更新博客了,主要是公司事情比较多,最近终于闲下来了.然而5.7也GA了,有许多新的特性,其中现在可以进行在线设置复制过滤了.但是还是得停复制,不过不用重启实例了.方便了DBA们进行临时性的调整 ...
- mysql 5.7主从库复制设置
先要修改配置文件,重启mysql服务 log-bin= mysql-binlog # 打开二进制日志 ,最好放在不同的硬盘上,减小 IO 消耗 expire_logs_day= # 设置二进制日志保存 ...
- MySQL/MariaDB数据库的主从级联复制
MySQL/MariaDB数据库的主从级联复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主从复制类型概述 1>.主从复制 博主推荐阅读: https://ww ...
- mysql主从延迟复制
需求描述 正常情况下我们是不会有刻意延迟从库的需求的,因为正常的线上业务自然是延迟越低越好.但是针对测试场景,业务上偶尔需要测试延迟场景下业务是否能正常运行. 解决方案 针对这种场景mysql有一个叫 ...
- mysql主从服务器复制操作
master主机ip:192.168.1.19 用户名sunzy 密码123456slave主机ip:192.168.1.20 1.配置master1)接下来对master进行配置,包括打开二进制日 ...
- MYSQL管理之主从同步管理
原文地址:MYSQL管理之主从同步管理 作者:飞鸿无痕 MYSQL管理之主从同步管理 MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重 ...
随机推荐
- C语言实现链栈
我自己写的代码部分: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct ...
- MongDB-基础
首先吐槽一下,MongDB用到了JS的引擎,只要涉及到了JS,语法就变得又臭又长,真是无语 还有,MongDB的安装真是麻烦,我用的是win10环境,怎么装都报服务错误,redis一装就可以用,希望m ...
- BeagleBone Black 从零到一 (2 MLO、U-Boot) 转
文章原址:jexbat.com/categories/BeagleBone/ 什么是 U-Boot 熟悉嵌入式开发的应该都听过它,U-boot 就是启动系统前的一段引导程序,虽然是引导程序,但是功能非 ...
- Linux学习笔记8
其他常用命令 cd+回车=回车~ 进入当前用户主目录 查看指定进程信息 #ps -ef |grep 进程名 #ps ---查看属于自己的进程 #ps -aux 查看所有用户的执行进程 换成 p ...
- [PA2014]Bohater
[PA2014]Bohater 题目大意: 有\(n(n\le10^5)\)只怪物,你的血量为\(z\).要打败第\(i\)只怪物时,你需要先消耗\(d_i\)点生命值,再恢复\(a_i\)点生命值. ...
- ssm框架出现的常见问题
1:自己写的代码测试的时候显示用户过期,需要释放拦截器,并配置权限允许 2:Servlet.service() for servlet [springmvc] in context with path ...
- session与cookie的区别是什么?如果客户端禁用了cookie功能,将会对session有什么影响?
cookie 和session 的区别: a.cookie数据存放在客户的浏览器上,session数据放在服务器上. b.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE ...
- echarts中dataZoom的使用
ataZoom的使用方法 功能: 1.有inslide和slide两种dataZoom,也分X,Y轴 两种dataZoom的使用 dataZoom:[ { type:"slider" ...
- PAT Basic 1002
1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1 ...
- db2 执行报错收集
1.对于执行中的报错,可以在db2命令行下运行命令 : db2=>? SQLxxx 查看对应的报错原因及解决方法. 2.错误SQL0206N SQLSTATE=42703 检测到一个未定义的列 ...