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 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

MySQL分页性能优化指南

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽...

713
来自专栏架构师之旅

Oracle使用总结之异常篇

1.1 异常处理概念 1.1.1 预定义的异常处理 1.1.2 非预定义的异常处理 1.1.3 用户自定义的异常处理 1.1.4 用户定义的异常处理 1.2 ...

1886
来自专栏小灰灰

mysql之基本语法

本篇将主要集中在mysql的使用上,包括如何创建标,如何进行insert,update,select,delete,以及一些常见的sql中关键字的使用姿势

49222
来自专栏闻道于事

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段。 可以将游标形象的...

2896
来自专栏WindCoder

MySQL事务与存储引擎-数据库事务单元测试

这是微专业参加单元测试后的试题及答案整理,分享出来,供大家参考,所有标红的为答案。

441
来自专栏杨建荣的学习笔记

闪回归档的简单测试(r8笔记第68天)

11g里面的新特性闪回归档,为历史数据的定制查询提供了一种可能。抽时间学习了一下这个特性,发现还是比较清晰易用。如果使用得当还是很不错的一个特性。 我们来简单模...

3075
来自专栏乐沙弥的世界

PL/SQL -->隐式游标(SQL%FOUND)

在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

743
来自专栏乐沙弥的世界

临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是 对于大...

883
来自专栏数据和云

【Oracle字符集】乱码的产生原理

编辑手记:很多人在数据库各种操作中遭遇过乱码的问题,今天我们分析一下乱码产生的原因。本文节选于《循序渐进Oracle》 通常在现实环境中,存在3个字符集设置: ...

3106
来自专栏守候书阁

编写自己的代码库(javascript常用实例的实现与封装--续)

这个系列的上一篇文章(编写自己的代码库(javascript常用实例的实现与封装))总结了34个常见的操作。但是在开发中,常见的实例又何止这么多个,经过这些日子...

693

扫描关注云+社区