之前在没有备库的情况下,遇到过more than 'max_binlog_cache_size' bytes of storage 的错误,今天在主备复制的时候又遇到了这个问题

Last_SQL_Errno: 1197
Last_SQL_Error: Worker 14 failed executing transaction '' at master log mysql-bin.050101, end_log_pos 2669492980; Could not execute Delete_rows_v1 event on table time_dispatcher_0029.ttd_task_1889; Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again, Error_code: 1197; handler error HA_ERR_RBR_LOGGING_FAILED; the event's master log mysql-bin.050101, end_log_pos 2669492980

slave

root@(none) 10:11:38>show variables like '%binlog_%size%';
+----------------------------+----------------------+
| Variable_name | Value |
+----------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_stmt_cache_size | 32768 |
| max_binlog_cache_size | 2147483648 |
| max_binlog_size | 524288000 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
+----------------------------+----------------------+
root@(none) 09:51:00>show status like 'binlog_%';
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| Binlog_cache_disk_use | 86332 |
| Binlog_cache_use | 320562298 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 145 |
+----------------------------+-----------+

master

root@(none) 10:07:17>show variables like '%binlog_cache_size%';
+-----------------------+-------------+
| Variable_name | Value |
+-----------------------+-------------+
| binlog_cache_size | 32768 |
| max_binlog_cache_size | 10737418240 |
+-----------------------+-------------+

主备设置不一致导致主库写binlog成功,备库在恢复relog的时候同样记录binlog,但是主备cache大小设置不同,所以导致了上边的问题。

主备参数的一致性很重要!!!!

修复

root@(none) 10:08:49>stop slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
root@(none) 10:08:32>set global max_binlog_cache_size=10737418240;
Query OK, 0 rows affected (0.00 sec)
root@(none) 10:08:49>start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)

max_binlog_cache_size

如果事务需要内存超过此字节数,服务器生成如下错误ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage;max_binlog_cache_size最低值是4096,最大可能值为16EB(艾字节)。推荐的最大值为4GB ;因为目前的MySQL当二进制日志位置大于4GB时并不生效。

Note:

Prior to MySQL 5.6.7, 64-bit Windows platforms truncated the stored value for this variable to 4G, even when it was set to a greater value (Bug #13961678).

在MySQL 5.6 ,会话对于max_binlog_cache_size的感知依赖于binlog_cache_size系统变量;换句话说,改变其值只会影响后续新建会话。

max_binlog_size

如果写二进制日志导致当前日志文件大小超过了这个变量的值时,服务器旋转二进制日志(关闭当前的文件,并打开下一个) 。的最小值为4096字节。最大值和默认值是1GB 。

事务是以块为单位写入二进制日志的,因此它不会被拆分在几个二进制日志。如果你有大的交易,你可能会看到比max_binlog_size较大的二进制日志文件。

如果max_relay_log_size为0,max_binlog_size的值会被应用到中继日志。

max_binlog_stmt_cache_size

如果一个事务中的非事务性的语句需要大于这个数量的更多的内存,服务器会产生报错。最低值是4096 ,在32位平台最大和默认值是4GB。在64位平台最大和默认值是416EB(艾字节)。

Note

Prior to MySQL 5.6.7, 64-bit Windows platforms truncated the stored value for this variable to 4G, even when it was set to a greater value (Bug #13961678).

max_binlog_cache_size针对事务语句,max_binlog_stmt_cache_size针对非事务语句,当我们发现Binlog_cache_disk_use或者Binlog_stmt_cache_disk_use比较大时就需要考虑增大cache的大小

事务性语句&非事务性语句

在事务性语句执行过程中,服务器将会进行额外的处理,在服务器执行时多个事务是并行执行的,为了把他们的记录在一起,需要引入事务缓存的概念。在事务完成被提交的时候一同刷新到二进制日志。 对于非事务性语句的处理。遵循以下3条规则:

  1. 如果非事务性语句被标记为事务性,那么将被写入事务缓冲。
  2. 如果没有标记为事务性语句,而且事务缓存中没有,那么直接写入二进制日志。
  3. 如果没有标记为事务性语句,但是事务缓存中有,那么写入事务缓冲。

注意如果在一个事务中有非事务性语句,那么将会利用规则2,优先将该影响非事务表语句直接写入二进制日志。

如果一切正常,当事务中执行事务语句(DML)的时候,所以这些语句形成的event都会被记录到缓存里面,等到commit事务以后,这个缓存的数据会立即被刷入磁盘上的binlog文件里面,之后通过slave请求发送到slave,在slave重复执行。

顺便提一下,mysql的binlog里面的事务都是相互独立按顺序排列的。

现在开始假设意外的发生。

正常意外一:事务执行中rollback了。

如果在一个事务中,所有执行的语句都是在innodb表上执行(对于多个事务引擎如tokudb等并用尚未测试),直接执行rollback,会导致mysql直接清除缓存,不会写入任何event记录到binlog。

正常意外二:事务执行中使用了非事务表(myisam),然后rollback了。

在一个事务中,即有事务表,也有非事务表,如果正常执行,则没有任何问题,当如果在非事务表上的修改执行了,复制设置为statement的时候,binlog会把所有执行的event全部记录下来写入日志,包括事务与非事务语句,然后在最后面加上rollback。如果复制格式设置为row,那么所有事务表相关的数据都会被清理掉,而非事务表上的数据会被标记为已提交事务写入binlog。

正常意外三:事务执行顺序如下:事务语句1-》非事务语句2-》save point -》事务语句3 -》 rollback to savepoint -》 事务语句4 -》提交

对于上面的情况,statement情况下,所有执行的语句包括savepoint与rollback都会按顺序被记录到binlog。row情况下,非事务语句与事务语句是分别记录到binlog中,非事务执行event会全部被记录,事务执行event会连带savepoint与rollback都记录下来。

正常意外四:事务执行顺序如下:事务语句1-》savepoint-》非事务语句2-》事务语句3-》rollback to savepoint-》事务语句4 -》 commit

同上。

异常意外一:master正常提交了,但是在slave执行失败了。

master执行完成,提交之后,slave接收到relay然后执行,执行期间由于意外原因失败了。这个时候,statement格式下,mysql会重新回到事务begin处重新执行,如果再次失败的话就会报错。row模式下情况类似,区别在于,如果是包含非事务表执行的事务,非事务表上的event不会被重新执行。

参考

Binary Log Options and Variables

max_binlog_stmt_cache_size

mysql复制对事务的处理

mysql二进制日志处理事务与非事务性语句的区别

【MySQL】binlog缓存的问题和性能的更多相关文章

  1. mysql查询缓存打开、设置、参数查询、性能变量意思

    http://blog.sina.com.cn/s/blog_75ad10100101by7j.html http://www.cnblogs.com/zemliu/archive/2013/08/0 ...

  2. mysql binlog参数设置

    1.mysql有许多系统变量,可以设置,系统变量设置不同,不同的系统将导致执行状态. 故mysql提供两组命令,分别查看系统设置和执行状态. 1.系统设置: SHOW [GLOBAL | SESSIO ...

  3. MySQL Binlog常用参数

    ====================================================================== MySQL Binlog常用参数 log_bin 设置此参 ...

  4. MySQL Binlog 解析工具 Maxwell 详解

    maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...

  5. MySQL Binlog 介绍

    Binlog 简介 MySQL中一般有以下几种日志: 日志类型 写入日志的信息 错误日志 记录在启动,运行或停止mysqld时遇到的问题 通用查询日志 记录建立的客户端连接和执行的语句 二进制日志 记 ...

  6. Mysql binlog二进制日志

    Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的实际原sql语句都会被记录在binlog中. 优点:不需要记录每一 ...

  7. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  8. Mysql Binlog日志文件介绍

    一.Binlog简介 官方文档参考 https://dev.mysql.com/doc/refman/5.5/en/binary-log.html Binlog(Binary Log) 指数据库的表创 ...

  9. 20180705关于mysql binlog的解析方式

    来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...

随机推荐

  1. meta 标签 关键字 用处

    您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站, 人们首先想到的方法无外乎以下几种: l 在搜索引擎中登录自己的个人网站 l 在知名网站加入你个人网 ...

  2. AttributeError: 'NoneType' object has no attribute 'bytes' python3.4 win64

    解决方法: easy_install -U pip 详见: https://github.com/pypa/pip/issues/2669

  3. spark yarn-cluster 和 yarn-client提交的配置

    1. spark conf 目录下需要配置进去hadoop home 2.需要spark 提交的配置文件 加上‘-- master yarn-cluster/yarn-client’设置提交的模式

  4. rectangle类。java

    import java.util.Scanner; class rectangle{    int l,w;    rectangle(int lon,int wid){    l=lon;    w ...

  5. js中arguments,caller,callee,apply的用法小结

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <style typ ...

  6. WCF入门教程五[WCF的通信模式]

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  7. PHP正则匹配邮件地址、URL

    匹配邮件 #^[A-Za-z0-9]+[\w\.-]*@[A-Za-z0-9]+[A-Za-z0-9\.-]*[A-Za-z0-9]$# 注意 1. \w 表示的是 [A-Za-z0-9_] 包括下划 ...

  8. SQL Server 表所在的文件组

    SELECT  o.[name] ,-- o.[type], i.[name], i.[index_id],         f.[name] FROM    sys.indexes i        ...

  9. Nginx 499错误的原因及解决方法

    今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */n ...

  10. TKinter之输入框

    输入框是 Entry,应用程序要取得用户的信息,输入框是必不可少的. 输入框比较重要的一个函数: get:返回值即输入框的内容 比如e是一个输入框,e['show']='*'就变成了密码框 小例子:用 ...