关键词: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. (转)java 层调用Jni(Ndk) 持久化c c++ 对象

    对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成 ...

  2. Linux目录详细说明大全(推荐)

    Linux目录详细说明大全,方便你以后合理规划及管理 "/" : 根目录Linux文件系统的入口.也是最高级,最重要的的目录.除衍生出其它目录,还和系统的开机,还原,系统修复有的, ...

  3. java-信息安全(十四)-初探SSL

    原文地址 http://snowolf.iteye.com/blog/397693 我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中生成的自签名证书zlex.cer     这里,我们将证 ...

  4. 12外观模式Facade

    一.什么是外观模式 Facade模式也叫外观模式,是由GoF提出的 23种设计模式中的一种.Facade模式为一组具 有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的 ...

  5. 解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题

    1.缩放VMware,当ubuntu中出现下拉导航条时,点击左上角查看>立即适应客户机,然后在pycharm中打中文的时候不用全屏,就可以看到输入法显示的文字了. 2.目前没有发现搜狗输入法版本 ...

  6. PHP实现敏感词过滤系统

    PHP实现敏感词过滤系统 安装说明 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html 安装PHP扩展 swoole,安装教程 htt ...

  7. WebKit最新特性srcset简介(转)

    WebKit内核最新新增了对srcset属性的支持(参考:https://www.webkit.org/blog/2910/improved-support-for-high-resolution-d ...

  8. Qt编写GIF录屏工具(开源)

    在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基本上都支持 ...

  9. Win10配置分屏显示

    新买的电脑是17.3的,单独打开一个界面总是感觉地方有点浪费,研究了下分屏使用. 以下是现在分屏后的电脑界面. 设置说明 目的:将三个窗口分屏布满屏幕,便于多任务操作. 步骤: 1.按住鼠标左键,将w ...

  10. G - 看病要排队

    看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服 ...