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主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重 ...
随机推荐
- zoj 1002 Fire Net 碉堡的最大数量【DFS】
题目链接 题目大意: 假设我们有一个正方形的城市,并且街道是直的.城市的地图是n行n列,每一个单元代表一个街道或者一块墙. 碉堡是一个小城堡,有四个开放的射击口.四个方向是面向北.东.南和西.在每一个 ...
- Windows 自动启动 bat
创建文件,然后把这个文件放到window开机自动执行的目录中,之后的每次开机都会重新启动这个脚本 cd /d %~dp0 %1 start "" mshta vbscript:cr ...
- linux学习笔记 4建立用户
一般用法 #useradd mysql 含义 创建 mysql用户 特殊用法 1> #useradd -d /usr/cjh -m cjh 含义:创建cjh用户 产生一个主目录 /usr/cj ...
- TCP粘包问题
1.什么是粘包? 粘包指的是数据与数据之间没有明确的分界线,导致不能正确的读取数据.换句话说就是接收方不知道发送方一次到底发送了多少数据.只有TCP才会出现粘包现象,UDP不会出现粘包现象,因为TCP ...
- Vue初始
一 .安装 https://cn.vuejs.org/ 官方网站 二 .简单实用示例 Vue.js 使用了基于 HTML 的模板语法,最简单的使用vue的方式是渲染数据,渲染数据最常见的形式就是使 ...
- url两次编码
encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数 ...
- 大道至简第一章Java伪代码
1.编程的精义//愚公移山public class Yugong{public static void main(String[]args){ while(山没平){ ...
- Python3基础-分数运算
Python3分数运算 fractions 模块可以被用来执行包含分数的数学运算. 案例 >>> from fractions import Fraction >>> ...
- Shell脚本笔记(四)条件判断
条件判断 一.条件测试与比较 一)条件测试基础语法 下列测试语法中如果测试的表达式成立,条件测试就会结束,并返回0. 1.test条件测试 语法:test <测试表达式> 2.中括号条件 ...
- (Android数据传递)Intent消息传递机制 “Intent”“数据传递”
Intent类的继承关系: 需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...