(4.7)mysql备份还原——深入解析二进制日志(3)binlog的三种日志记录模式详解
关键词:binlog模式,binlog,二进制日志,binlog日志
目录概述
0、binlog概述
查看binlog日志参数设置: show variables like '%log_bin%';
查看binlog文件事件信息:show binlog events in 'binlog.000003';
设计到3个参数:
(1)binlog_format='row' -- (row,statement,mixed)
日志记录模式,行、语句、混合
(1.1)statement:基于语句的复制(5.5.6之前默认),主服务器执行的SQL语句,在从服务器执行同样的语句
(1.2)row:基于行的复制(5.5.7之后默认),把改变的内容复制到从库,而不是把SQL命令在从库重新执行一遍。mysql5.0就开始支持
(1.3)mixed:混合类型的复制,默认是使用 statement 语句方式复制,一旦发现基于语句无法精确复制时(比如now() 因为主从有延迟导致数据不一致)就会采用基于 row 行的方式复制。
(2)binlog_row_image=full -- (full,minimal,noblob)
如果是用行的话,记录全部的记录、最小的记录、不记录二进制
(2.1)full:记录所有的列字段新旧字段记录(即使那一列没有更新到) -- insert/update语句的set部分是全部的新记录,delete/update的where部分是全部的旧记录
(2.2)minimal:只记录被更新到的新旧字段记录 -- insert/update语句的set部分是全部的新记录,update语句只有修改的列内容,update/delete的where部分没有记录(如果是主键或者唯一索引则会记录)
(2.3)noblob:二进制字段,不记录,其余的与minimal相同
(3)binlog_rows_query_log_events=on -- (on,off)
为off时,binlog中的记录,dml里面写的是行记录且加密,而不是SQL语句,DDL是明文。
为on时,dml里面写的是SQL语句+行记录详细信息,DDL是明文。
[0.1]、binlog_format='statement'
【1.3】总结(对主从的影响)
(1)这种方式下,使用RC、RUC隔离级别会报错。
(2)DDL以及DML都是明文按SQL记录存储。
(3)对有些参数,在不同的服务器和不同的时间,执行的结果不一样,会导致主从不一致。比如currment_date,timestamp。
特别是一些函数:uuid(),user(),时间函数now()
(4)性能问题:比如主库有一条慢SQL执行了,也会去从库执行
(5)数据异常:主从数据不一致,执行也会有问题
[0.2]、binlog_format='row'
binlog_row_image=full;
binlog_rows_query_log_events=off;-- 显示较为详细的DML信息,明文DDL,加密DML
【2.3】总结
(1)ddl操作时明文,而dml操作时加密(dml里面写的是行记录,而不是SQL语句)
(2)针对加密的操作反解析加参数-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)对复制的影响
a.同步最安全
b.不管是更新还是删除,或者批量操作数据,都是按行记录,依次处理所有行的记录,而不是SQL。
(4)查看事件(ddl为sql明文,dml为加密记录)
show binlog events in 'binlog.000004';
[0.3]、binlog_format='row'
binlog_row_image=full;
binlog_rows_query_log_events=on; --显示SQL语句+更详细(数据类型)的DML信息
【3.3】总结
(1)ddl操作时明文,而dml操作时加密(dml里面写的是SQL语句+行记录详细信息)
(2)针对加密的操作反解析加参数-v,加2个-v
mysqlbinlog --base64-output=decode-rows -v -v binlog.000005
(3)对复制的影响
a.同步最安全
b.不管是更新还是删除,或者批量操作数据,都是按行记录,依次处理所有行的记录,而不是SQL。
(4)查看事件(ddl为sql明文,dml为加密记录)
show binlog events in 'binlog.000005';
[0.4]、binlog_format='mixed'
理解了row与statement模式以后,mixed=statement和row
大多数情况下是以statement模式记录,如果隔离级别为RC,那么会以row模式记录
混合类型的记录,默认是使用 statement 语句方式记录,一旦发现基于语句无法精确记录时(比如now() 因为主从有延迟导致数据不一致)就会采用基于 row 行的方式复制。
0、概述
查看binlog日志参数设置: show variables like '%log_bin%';
查看binlog文件事件信息:show binlog events in 'binlog.000003';

涉及到3个参数
(1)binlog_format='row' -- (row,statement,mixed)
日志记录模式,行、语句、混合
(2)binlog_row_image=full -- (full,minimal,noblob)
如果是用行的话,记录全部的记录、最小的记录、不记录二进制
(2.1)full:记录所有的列字段新旧字段记录(即使那一列没有更新到) -- insert/update语句的set部分是全部的新记录,delete/update的where部分是全部的旧记录
(2.2)minimal:只记录被更新到的新旧字段记录 -- insert/update语句的set部分是全部的新记录,update语句只有修改的列内容,update/delete的where部分没有记录(如果是主键或者唯一索引则会记录)
(2.3)noblob:二进制字段,不记录,其余的与minimal相同
(3)binlog_rows_query_log_events=on -- (on,off)
为off时,binlog中的记录,dml里面写的是行记录且加密,而不是SQL语句,DDL是明文。
为on时,dml里面写的是SQL语句+行记录详细信息,DDL是明文。
1、binlog_format='statement'
【1.3】总结(对主从的影响)
(1)这种方式下,使用RC、RUC隔离级别会报错。
(2)DDL以及DML都是明文按SQL记录存储。
(3)对有些参数,在不同的服务器和不同的时间,执行的结果不一样,会导致主从不一致。比如currment_date,timestamp。
特别是一些函数:uuid(),user(),时间函数now()
(4)性能问题:比如主库有一条慢SQL执行了,也会去从库执行
(5)数据异常:主从数据不一致,执行也会有问题
【1.1】准备工作
-- 修改binlog记录模式
set session binlog_format='statement';
set global binlog_format='statement';
select @@global.binlog_format,@@binlog_format; -- 修改隔离级别为重复度
set global tx_isolation='repeatable-read'; -- 旧的设置方法
set global transaction_isolation='repeatable-read'; -- 新的设置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation; -- 刷新binlog日志
show master status;
flush logs;
show master status; 【1.2】 测试
-- 建表
create table test2(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ; -- 插入数据
insert into test2(tablename,UUID) select 'test2',uuid();
-- 更新数据
update test2 set tablename='test2_update' where id = 1;
-- 提交
commit;
-- 查看状态
show master status; -- 会发现position有了变化,之前是154,现在是2125
-- 退出mysql,进入binlog目录,使用mysqlbinlog 查看binlog信息
mysqlbinlog --start-position=154 --stop-position=2125 binlog.000002 【1.3】总结(对主从的影响)
(1)这种方式下,使用RC、RUC隔离级别会报错。
(2)DDL以及DML都是明文按SQL记录存储。
(3)对有些参数,在不同的服务器和不同的时间,执行的结果不一样,会导致主从不一致。比如currment_date,timestamp。
特别是一些函数:uuid(),user(),时间函数now()
(4)性能问题:比如主库有一条慢SQL执行了,也会去从库执行
(5)数据异常:主从数据不一致,执行也会有问题
(6)查看Binlog事件
show binlog events in 'binlog.000003';

2、binlog_format='row'
binlog_row_image=full;
binlog_rows_query_log_events=off;-- 显示较为详细的DML信息,明文DDL
【2.3】总结
(1)ddl操作时明文,而dml操作时加密(dml里面写的是行记录,而不是SQL语句)
(2)针对加密的操作反解析加参数-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)对复制的影响
a.同步最安全
b.不管是更新还是删除,或者批量操作数据,都是按行记录,依次处理所有行的记录,而不是SQL。
(4)查看事件(ddl为sql明文,dml为加密记录)
show binlog events in 'binlog.000004';
【2.1】全部记录+操作事件
binlog_row_image=full;
binlog_rows_query_log_events=off; 【2.2】测试
-- 设置模式
set session binlog_format='row';
set global binlog_format='row';
set session binlog_rows_query_log_events=off; -- 默认
set global binlog_rows_query_log_events=off; -- 默认
set global binlog_row_image=full; -- 默认
set session binlog_row_image=full; -- 默认
select @@global.binlog_format,@@binlog_format,
@@global.binlog_rows_query_log_events,@@binlog_rows_query_log_events,
@@global.binlog_row_image,@@binlog_row_image\G
--设置隔离级别为可重复读
set global tx_isolation='repeatable-read'; -- 旧的设置方法
set global transaction_isolation='repeatable-read'; -- 新的设置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation;
-- 刷新binlog日志
show master status;
flush logs;
-- mysqladmin -uroot -p flush-logs; mysql -uroot -p -e 'flush logs';
show master status;
--建表
create table test3(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ; -- 增删改数据
insert into test3(tablename,UUID) select 'test3',uuid();
insert into test3(tablename,UUID) select 'test3',uuid();
update test3 set tablename='test3_update' where id = 1;
commit; delete from test3 where id = 1;
commit; drop table test3; show master status; -- 会发现position有了变化,之前是154,现在是2125 -- 退出mysql,进入binlog目录,使用mysqlbinlog 查看binlog信息
mysqlbinlog binlog.000004
-- mysqlbinlog --start-position=154 --stop-position=2125 binlog.000004 【2.3】总结
(1)ddl操作时明文,而dml操作时加密(dml里面写的是行记录,而不是SQL语句)
(2)针对加密的操作反解析加参数-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)对复制的影响
a.同步最安全
b.不管是更新还是删除,或者批量操作数据,都是按行记录,依次处理所有行的记录,而不是SQL。
(4)查看事件(ddl为sql明文,dml为加密记录)
show binlog events in 'binlog.000004';
3、binlog_format='row'
binlog_row_image=full;
binlog_rows_query_log_events=on; --显示SQL语句+更详细(数据类型)的DML信息
【3.1】全部记录+详细事件
binlog_row_image=full;
binlog_rows_query_log_events=on; 【3.2】测试
-- 设置模式
set session binlog_format='row';
set global binlog_format='row';
set session binlog_rows_query_log_events=on; -- 手动指定
set global binlog_rows_query_log_events=on; -- 手动指定
set global binlog_row_image=full; -- 默认
set session binlog_row_image=full; -- 默认
select @@global.binlog_format,@@binlog_format,
@@global.binlog_rows_query_log_events,@@binlog_rows_query_log_events,
@@global.binlog_row_image,@@binlog_row_image\G --设置隔离级别为可重复读
set global tx_isolation='repeatable-read'; -- 旧的设置方法
set global transaction_isolation='repeatable-read'; -- 新的设置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation; -- 刷新binlog日志
show master status;
flush logs;
-- mysqladmin -uroot -p flush-logs; mysql -uroot -p -e 'flush logs';
show master status; --建表
create table test4(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ; -- 增删改数据
insert into test4(tablename,UUID) select 'test4',uuid();
insert into test4(tablename,UUID) select 'test4',uuid();
update test4 set tablename='test4_update' where id = 1;
commit; delete from test4 where id = 1;
commit; drop table test4; show master status; -- 会发现position有了变化,之前是154,现在是2125 -- 退出mysql,进入binlog目录,使用mysqlbinlog 查看binlog信息
mysqlbinlog binlog.000005
-- mysqlbinlog --start-position=154 --stop-position=2125 binlog.000005 【3.3】总结
(1)ddl操作时明文,而dml操作时加密(dml里面写的是SQL语句+行记录详细信息)
(2)针对加密的操作反解析加参数-v,加2个-v
mysqlbinlog --base64-output=decode-rows -v -v binlog.000005
(3)对复制的影响
a.同步最安全
b.不管是更新还是删除,或者批量操作数据,都是按行记录,依次处理所有行的记录,而不是SQL。
(4)查看事件(ddl为sql明文,dml为加密记录)
show binlog events in 'binlog.000005'; (2)中:mysqlbinlog --base64-output=decode-rows -v -v binlog.000005

(4)中:show binlog events in 'binlog.000005'; SQL语句与操作内容全部都有

4、binlog_format='mixed'
理解了row与statement模式以后,mixed=statement和row
大多数情况下是以statement模式记录,如果隔离级别为RC,那么会以row模式记录
(4.7)mysql备份还原——深入解析二进制日志(3)binlog的三种日志记录模式详解的更多相关文章
- (4.5)mysql备份还原——深入解析二进制日志(1)binlog的3种工作模式与配置
(4.5)mysql备份还原——深入解析二进制日志(binlog) 关键词:二进制日志,binlog日志 0.建议 (1)不建议随便去修改binlog格式(数据库级别) (2)binlog日志的清理 ...
- (4.6)mysql备份还原——深入解析二进制日志(2)binlog参数配置解析
关键词:binlog配置,binlog参数,二进制日志配置,二进制文件参数配置 关键词:binlog缓存,binlog 刷新 0.bin写入流程 写binlog流程如下:# 数据操作buffer po ...
- MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术
二进制日志文件Binlog的格式主要有三种: 1.Statement:基于SQL语句级别的Binlog,每条修改数据的SQL都会保存到Binlog里面. 2.ROW:基于行级别,每一行数据的变化都会记 ...
- (4.3)mysql备份还原——mysql备份策略
(4.3)mysql备份还原——mysql备份策略 1.指定备份策略时需要考虑的点 [1.1]备份周期:2次备份间隔时长 [1.2]备份方式:在备份周期中,使用什么备份方式.备份模式 [1.3]实现方 ...
- (4.8)mysql备份还原——binlog查看工具之show binlog的使用
(4.8)mysql备份还原——binlog查看工具之mysqlbinlog及show binlog的使用 关键词:show binlog,mysql binlog查看,二进制文件查看,binlog查 ...
- (4.1)mysql备份还原——mysql常见故障
(4.1)mysql备份还原——mysql常见故障 1.常见故障类型 在数据库环境中,常见故障类型: 语句失败,用户进程失败,用户错误 实例失败,介质故障,网络故障 其中最严重的故障主要是用户错误和介 ...
- mysql主从复制搭建中几种log和pos详解
一.主从原理 Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...
- Mysql三种日志(binlog,redolog,undolog)的作用和区别
Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...
- (4.16)mysql备份还原——物理备份之XtraBackup实践
关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...
随机推荐
- Memcached 总结 启动多个Memcached服务 配置文件详解
一. 1.解压下载的安装包到指定目录. 2.服务安装,使用管理员权限运行以下命令: c:\memcached\memcached.exe -d install 二.同一台Windows机器中启动多个M ...
- Golang Gin 框架 Route备注
https://www.jianshu.com/p/d4b52187d233 https://blog.csdn.net/weixin_34210740/article/details/8602756 ...
- springboot logback 集成
在 application.yml 中敲 logging.pattern.consle ,IDEA 会联想到对应的值.单击属性就可以跳到 LoggingApplicationListener.java ...
- [Android] 基于 Linux 命令行构建 Android 应用(三):构建流程
Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件..apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如 ...
- Linux设备文件三大结构:inode,file,file_operations
驱动程序就是向下控制硬件,向上提供接口,这里的向上提供的接口最终对应到应用层有三种方式:设备文件,/proc,/sys,其中最常用的就是使用设备文件,而Linux设备中用的最多的就是字符设备,本文就以 ...
- iOS - 高德地图将地图的多点连线
@property (nonatomic, strong) MAPolyline *commonPoly; #pragma mark -- 将地图的点连线 - (void)createBrokenLi ...
- 6.25python线程问题
#encoding=utf-8 #2018-6-25 20:34:48 #解决耦合的问题#用队列解决这种问题,起到了缓冲的作用 import threading import time # #pyth ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是r ...
- [No0000127]WCF安全体系netTCPBinding绑定
netTCPBinding绑定之Transport安全模式 一.netTCPBinding 此绑定使用TCP传输协议,不具交互性,只适用于 WCF 到 WCF 的通信. 此绑定的传输安全性的实现: ...
- [No0000FC]C# 预处理器指令
预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不以分号(;)结束. ...
