MySQL中,一条语句是否会被binlog记录以及以什么样的模式记录

Binlog官方

In MySQL 5.6, whether a statement is to be logged and thelogging mode to be used is determined according to the type of statement (safe,unsafe, or binary injected), the binary logging format (STATEMENT, ROW, orMIXED), and the logging capabilities of the storage engine (statement capable,row capable, both, or neither). (Binary injection refers to logging a changethat must be logged using ROW format.)

翻译

MySQL 5.6 中,一条语句是否会被binlog记录以及以什么样的模式记录,主要取决于语句的类型(safe,unsafe, or binary injected),binlog格式(STATEMENT, ROW, or MIXED)和 存储引擎对binlog_format 的支持能力(statement capable, row capable, both, or neither)。二进制形式记录必须使用row模式。

各种引擎对于binlog format的支持

下面的表格展示了各种引擎对于binlog format的支持:

  • 所以,如果transaction_isolation设置为 REPEATABLE-READ 或者SERIALIZABLE , Innodb的binlog_format可以是STATEMENT、ROW、MIXED中的任何一种;
  • 否则,无论Innodb的binlog_format 设置为STATEMENT、ROW、MIXED中的任何一种,实际记录的也只是ROW格式。
  • Innodb默认事务隔离级别是REPEATABLE-READ。
  • MySQL 5.6默认的binlog format是 STATEMENT。(注意MySQL != Innodb)
  • 当binlog_format采用ROW格式的时候,binlog事务会受到max_binlog_cache_size的限制(The maximumrecommended value is 4GB; this is due to the fact that MySQL currently cannotwork with binary log positions greater than 4GB.),可能导致语句执行失败,如全量更新一张大表。

哪些情况会记录成row模式

当binlog_format=MIXED的时候,如下情况下会自动将 binlog 的格式由 STATEMENT变为 ROW 模式:

  • 当函数中包含 UUID() 时;
  • 2 个及以上包含 AUTO_INCREMENT 字段的表被更新时;
  • 视图中的语句需要运用 row 格式时,创建这个视图的语句也会使用row格式;

例如建立视图时使用了 UUID() 函数;

  • 使用 UDF 时;
  • 在非事务性表上执行 INSERT DELAYED 语句时;
  • 如果一个session执行了一条row格式记录的语句,并且这个session还有未关闭的临时表,那么当前session的在此之后的所有语句都会继续使用row格式,直到所有临时表都被drop掉(临时表不能使用row格式记录);
  • 使用了 FOUND_ROWS()、 ROW_COUNT();
  • 使用了 USER()、CURRENT_USER()或者CURRENT_USER;
  • 当语句中调用了系统参数(system variables),有一些只在session级别调用了的参数可以排除在此情况外, 详见: http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html;
  • 调用了mysql库中的log型table;
  • 使用了 LOAD_FILE() 函数;

原文发布于微信公众号 - MYSQL轻松学(learnmysql)

原文发表时间:2016-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

Hive 基础(2):库、表、字段、交互式查询的基本操作

1、命令行操作 (1)打印查询头,需要显示设置: set hive.cli.print.header=true; (2)加"--",其后的都被认为是注释...

31510
来自专栏拂晓风起

Log4Net ,.net和SQL Server的完美结合

1035
来自专栏运维小白

13.5 常用sql语句

常用sql语句目录概要 select count(*) from mysql.user; select * from mysql.db; select db f...

2125
来自专栏用户2442861的专栏

基于Spring + Spring MVC + Mybatis 高性能web构建

http://blog.csdn.net/zoutongyuan/article/details/41379851#comments

791
来自专栏yukong的小专栏

​【SpringBoot2.0系列06】SpringBoot之多数据源动态切换数据源

【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板

3196
来自专栏互联网开发者交流社区

数据操纵:SELECT, INSERT, UPDATE, DELETE

892
来自专栏码洞

核心技术靠化缘是要不来的——自己动手写ORM框架

开源市场上的Java的ORM框架一个都不好用,所以花了几天时间自己撸了一个 OrmKids,欢迎大家下载学习。遇到问题请关注公众号进群大家一起讨论。

772
来自专栏yukong的小专栏

【ssm个人博客项目实战04】mybatis实现博客类别的增删改查分页

在前面一节我们已经完成后台管理界面的一个实现,在这一节我完成其中的博客类别管理中如果分页显示博客类别信息。

935
来自专栏后端之路

SpringBoot来自Swagger的Restful文档生成

背景 基于SpringBoot的方案普遍要做到前后端分离 代码即文档 代码变化太快 文档经常忘记更改 方案 基于Swagger的方案可以比较简单的基于restf...

2249
来自专栏张善友的专栏

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft ...

2658

扫码关注云+社区