【20180507】MySQL主从在线修改从库binlog格式从STATEMENT更改成ROW格式

需求

公司内部有几十套基于传统复制的MySQL主从实例,而且binlog的格式都是STATEMENT格式。在接手这些MySQL主从实例之后就有考虑过想将binlog格式更改成ROW格式。而这次则是因为我们elk上面一个第三方工具需要解析和监听binlog信息,并且只能解析ROW格式的binlog,借此机会正好将公司部分MySQL主从复制实例的binlog格式更改成ROW格式。

ROW和STATEMENT比对

  1. row格式

    • 优点:就是能够完全保证主从数据的一致性,不会出现因为在SQL中使用MySQL自带的函数导致数据不一致的现象。例如:当使用now()函数的时候,可能因为从库延时的问题导致时间的数据不一致。线上是有遇到过这个问题的。
    • 缺点:就是会消耗比较大的磁盘空间和磁盘IO;还有一个比较重要的问题就是因为ROW格式是基于每行进行修改的,若是在master执行一个update修改5000行数据,那么slave就会执行5000次修改数据操作,那么这就会带来更严重的主从延迟。(因为我们线上使用的是MySQL5.6,是基于schema的并行复制,并且slave的硬件资源是比master差的)
  2. statement格式
    • 优点:就是消耗较少的磁盘存储和IO。
    • 缺点:可能会导致数据不一致,并且在做基于binlog恢复的时候可能会出现数据不一致的现象。

binlog格式变更的难点

虽然binlog变更是可以进行在线修改的,但是由于MySQL的master上面存在许多的长链接,哪怕你动态修改之后,长链接的写入和修改还是旧的binlog格式。在这里最开始有提出过俩个方案:

  • 重启master。但是线上业务无法中断,所以无法进行修改。
  • kill掉所有的长链接。但是由于长链接太多,一个个去kill掉的话实在是耗费时间和经历,所以也不被认可。

解决方案

最后还是回归到需求本身,关于我们的需求就是需要解析binlog的格式是ROW格式,所以我们最后的方案就是在slave上面修改binlog的格式为ROW格式。(log_slave_updates参数必须在slave上面打开。否则master通过binlog传递到slave上面重放的SQL是不会在slave本地的binlog记录的)

  • 但是需要注意的是修改完毕之后要想在slave上面的需要重启启动复制。即stop slave,start slave。否则是不会生效的。
  • 还有一个需要注意的是,当slave上面已经修改成了ROW格式的时候,这个时候在将slave的binlog格式修改成STATEMENT格式的话,复制是会报错的,哪怕重新restart slave 也会报错。

原文地址:http://blog.51cto.com/11819159/2113690

时间: 2024-10-15 23:23:07

【20180507】MySQL主从在线修改从库binlog格式从STATEMENT更改成ROW格式的相关文章

MySQL Binlog Mixed模式记录成Row格式

概念: binlog format有三种形式:Statement.Mixed.Row,具体的信息可以自行到网上搜查. 分析(本文碰到的案例): 查看MySQL binlog format [email protected] : dba_test 02:33:39>show variables like 'binlog_format%';                                                                                

MYSQL 主从添加新从库

MySQL 主从复制,不停机添加新从节点 1.主库创建账号: show master status; GRANT REPLICATION SLAVE ON . to 'reader'@'%' identified by 'readerpwd'; flush privilegs 2.从库配置 开启binlog log-bin=/var/lib/mysql/mysql-bin server-id=3 //参照原从库配置+1 3.备份主库 mysqldump -uroot -p123 --routin

一例mysql主从数据库,从库宕机后无法启动的解决方案

启动时报错信息: Starting MySQL... ERROR! The server quit without updating PID file (/usr/local/mysql/data/qkzhi-appzookeeper-1.novalocal.pid). 2017-08-25T09:14:20.974876Z mysqld_safe mysqld from pid file        /usr/local/mysql/data/qkzhi-appzookeeper-2.nov

MYSQL主从同步故障一例及解决过程

公司里有两个mysql服务器做主从同步,某天Nagios发来报警短信,mysqla is down...赶紧联系机房,机房的人反馈来的信息是 HARDWARE ERROR 后面信息省略,让机房记下错误信息后让他们帮忙重启下看是不是能正常起来,结果竟然正常起来了,赶紧导出所有数据.   问题又出现了,nagios 又报警,mysql_AB error,检查从库show slave status \G; 果然 Slave_IO_Running: YesSlave_SQL_Running: No而且出

MySQL主从备份

MySQL双机热备 环境说明 Msql主备结构 1.Master: Mysql主节点,Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程.返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置: 2.Slave: Slave节点, Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文

Lvs+keepalived+mysql主从热备

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: "Calibri", "sans-serif" } h1 { margin-top: 17.0pt; margin-right: 0cm; margin-bottom: 16.5pt; margin-left

MySQL主从修复

MySQL主从故障修复 测试库:192.168.1.2 主192.168.1.3 从 192.168.1.4 主 4又是2的从库192.168.1.5 从 有人修改了192.168.1.2和192.168.1.3的数据库参数后,重启数据库.忘记了192.168.1.4又是192.168.1.2的从库,导致192.168.1.2和192.168.1.4的主从断掉.并且在192.168.1.2上创建了新库还原数据删除等操作,导致192.168.1.4提示错误. 模拟如下:通过从库查看主从状态:mys

Windows下MySQL主从同步

Windows下MySQL主从同步修改master的my.ini配置文件在master中添加一个mysql主从复制需要的账号查看master的status修改slave的my.ini配置文件slave连接master库测试主从同步 Windows下MySQL主从同步 修改master的my.ini配置文件 从mysql官网下载的压缩包中默认是没有my.ini文件的,需要自己在根目录手动建立一个my.ini文件 [mysqld] #设置3310端口 port = 3310 #server-id和l

Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统上WinRAR或者好压软件一样的存在. 7-Zip软件下载与安装 网上下载相关安装包并完成安装,找到安装目录,复制7z.dll文件到D盘. .bat文件的制作 通过7-Zip软件使用手册了解到,通过动态命令行调用7z.dll可以把文件压缩成.tar.gz格式的,实际上是先将文件压缩成.tar格式的文