关键词: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的三种日志记录模式详解的更多相关文章

  1. (4.5)mysql备份还原——深入解析二进制日志(1)binlog的3种工作模式与配置

    (4.5)mysql备份还原——深入解析二进制日志(binlog) 关键词:二进制日志,binlog日志 0.建议 (1)不建议随便去修改binlog格式(数据库级别) (2)binlog日志的清理 ...

  2. (4.6)mysql备份还原——深入解析二进制日志(2)binlog参数配置解析

    关键词:binlog配置,binlog参数,二进制日志配置,二进制文件参数配置 关键词:binlog缓存,binlog 刷新 0.bin写入流程 写binlog流程如下:# 数据操作buffer po ...

  3. MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术

    二进制日志文件Binlog的格式主要有三种: 1.Statement:基于SQL语句级别的Binlog,每条修改数据的SQL都会保存到Binlog里面. 2.ROW:基于行级别,每一行数据的变化都会记 ...

  4. (4.3)mysql备份还原——mysql备份策略

    (4.3)mysql备份还原——mysql备份策略 1.指定备份策略时需要考虑的点 [1.1]备份周期:2次备份间隔时长 [1.2]备份方式:在备份周期中,使用什么备份方式.备份模式 [1.3]实现方 ...

  5. (4.8)mysql备份还原——binlog查看工具之show binlog的使用

    (4.8)mysql备份还原——binlog查看工具之mysqlbinlog及show binlog的使用 关键词:show binlog,mysql binlog查看,二进制文件查看,binlog查 ...

  6. (4.1)mysql备份还原——mysql常见故障

    (4.1)mysql备份还原——mysql常见故障 1.常见故障类型 在数据库环境中,常见故障类型: 语句失败,用户进程失败,用户错误 实例失败,介质故障,网络故障 其中最严重的故障主要是用户错误和介 ...

  7. mysql主从复制搭建中几种log和pos详解

    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...

  8. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  9. (4.16)mysql备份还原——物理备份之XtraBackup实践

    关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...

随机推荐

  1. k8s(1)-使用kubeadm安装Kubernetes

    安装前准备 1. 一台或多台主机,这里准备三台机器 角色 IP Hostname 配置(最低) 操作系统版本 主节点 192.168.0.10 master 2核2G CentOS7.6.1810 工 ...

  2. [APUE]进程控制(下)

    一.更改用户ID和组ID 可以用setuid设置实际用户ID和有效用户ID.可以用setgid函数设置实际组ID和有效组ID. #include <sys/types.h> #includ ...

  3. mui---开发直播APP

    因项目需要,需要开发一款直播类的APP,采用的技术是MUI,找到的参考文档如下: http://ask.dcloud.net.cn/article/13416

  4. ubuntu-18.04 root登录图形界面失败问题解决方案

    一.设置root密码 二.进入/etc/pam.d目录 主要修改两个文件(圈了红色框框),记得命令行下切换root账户(sudo -i)进行vim修改,刚安装的ubuntu没有vim支持,请根据提示进 ...

  5. 笔记本串口连接IBM 小机

    首先要有一根两头母的九针串口线&USB转串口线其次,配置波特率19200.数据位8.停止位1.无校验位.流控:Xon/Xoff P4是9600,P5 P6都是19200了( 默认是19200波 ...

  6. Ajax请求参数较长导致请求失败

    Ajax请求参数比较长,第5行参数大概1100个字符吧,是接口的请求报文. $.ajax({ type:"POST", url:"${ctx}/test.action?m ...

  7. 洛谷P1141 01迷宫【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1141 题意: 有一个填了0和1的n*n的格子,只能0走到1,1走到0 有m组询问(数据量是1e5),问某一个 ...

  8. [No0000145]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈2/4

    前言   虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...

  9. [No0000120]Python教程3/9-第一个Python程序

    现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你自己的电脑上.写程序也讲究一个感觉,你需 ...

  10. PHP之后期静态绑定

    PHP后期静态绑定的(late static bindings) 理解PHP延迟静态绑定 static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名.这个东西可以实现在父类 ...