【MySQL故障处理】 Seconds_Behind_Master= NULL Error_code: 1197

将处理主从故障的过程记录在此:

  • 故障1,Error_code: 1197 (max_binlog_cache_size)

数据库版本:5.7.9

报错信息:

[ERROR] Slave SQL for channel ‘‘: 
Worker 1 failed executing transaction ‘bea4612c-4828-11e7-90b3-a0423f31cad6:716212‘ at master log mysql.135371, end_log_pos 103016490; 
Could not execute Write_rows event on table ******; 
Multi-statement transaction required more than ‘max_binlog_cache_size‘ bytes of storage; 
increase this mysqld variable and try again, Error_code: 1197; 
Writing one row to the row-based binary log failed, Error_code: 1534; 
handler error HA_ERR_RBR_LOGGING_FAILED; 
the event‘s master log FIRST, end_log_pos 103016490, Error_code: 1197

处理过程:

根据报错信息,知道是max_binlog_cache_size小了,

解决办法:临时增加该值后restart slave即可以继续复制线程。

stop slave;
set global max_binlog_cache_size= 201326592;
start slave;

关于max_binlog_cache_size请看这里

如果一个事务需要多于设置值的内存,就会报上面的错。最小4096字节,最大支持4GB,因为binlog位置点最大4GB,支持动态修改

解决了问题,继续查找发生问题的原因,生产环境中的该参数设置为64M,当一个事务影响的数据量超过该值时,即会报错。

查看主库中日志的具体内容:

数据库日志格式为mixed,文件中记录的是row格式,使用下面命令查看

/bin/mysqlbinlog   -vv --base64-output=decode-rows mysql.135371 | more
精简后的内容:
#  13:43:59 server id *******  end_log_pos 10538 CRC32  Write_rows: table id 2776
# at 10538                                          
#  13:43:59 server id *******  end_log_pos 18175 CRC32  Write_rows: table id 2776
# at 18175                                         
#  13:43:59 server id *******  end_log_pos 25789 CRC32  Write_rows: table id 2776
# at 25789                                           
#  13:43:59 server id *******  end_log_pos 33424 CRC32  Write_rows: table id 2776
# at 33424                                            
#  13:43:59 server id *******  end_log_pos 40961 CRC32  Write_rows: table id 2776
# at 40961                                           
#  13:43:59 server id *******  end_log_pos 48553 CRC32  Write_rows: table id 2776
# at 48553                                          
#  13:43:59 server id *******  end_log_pos 56126 CRC32  Write_rows: table id 2776
# at 56126                                          
#  13:43:59 server id *******  end_log_pos 63671 CRC32  Write_rows: table id 2776
# at 63671                                          
#  13:43:59 server id *******  end_log_pos 71205 CRC32  Write_rows: table id 2776
# at 71205                                           
#  13:43:59 server id *******  end_log_pos 78753 CRC32  Write_rows: table id 2776
# at 78753                                           
#  13:43:59 server id *******  end_log_pos 86322 CRC32  Write_rows: table id 2776
# at 86322                                           
#  13:43:59 server id *******  end_log_pos 93925 CRC32  Write_rows: table id 2776

不出意外,执行的sql为

 insert into table1 select * from table2 where time > ‘2016-10-01‘

形式的多语句事务,查看binlog文件的大小,最大的超过了200M(max_binlog_size设置为50M)。

因此是大事务造成的,大事务还容易造成主从延时的问题,推荐将大事务拆分为小事务执行

107M  14:07 mysql.135380
101M  14:08 mysql.135381
112M  14:08 mysql.135382
110M  14:09 mysql.135383
124M  14:09 mysql.135384
 31M  14:10 mysql.135385
226M  14:10 mysql.135386
120M  14:12 mysql.135387
111M  14:13 mysql.135388
102M  14:14 mysql.135389
...
126M  14:16 mysql.135394
...
118M  14:23 mysql.135404
...
110M  14:28 mysql.135409
 63M  14:29 mysql.135410
104M  14:29 mysql.135411
 281  14:30 mysql.135412
115M  14:30 mysql.135413
112M  14:30 mysql.135414
127M  14:30 mysql.135415
119M  14:31 mysql.135416
 85M  14:32 mysql.135417
 60M  14:32 mysql.135418
151M  14:33 mysql.135419

欢迎批评指正

时间: 2024-10-19 14:20:09

【MySQL故障处理】 Seconds_Behind_Master= NULL Error_code: 1197的相关文章

mysql 插入not null 没有default报错(doesn't have a default value)

今天遇到一个问题,本身在本地数据执行插入sql没啥毛病,但上了测试环境就报错!找个许久发现和mysql的配置有关.查看本地数据库 select @@sql_mode 为空,测试环境执行发现: +---------------------+| @@sql_mode          |+---------------------+| STRICT_TRANS_TABLES |+---------------------+ 这种模式下相当于给sql加入了数据,语法的校验,如果有设置not null

MySQL故障处理一例_Another MySQL daemon already running with the same unix socket

MySQL故障处理一例:"Another MySQL daemon already running with the same unix socket". [[email protected]121 sbin]# service mysqld status mysqld 已停 [[email protected]-121 sbin]# service mysqld start Another MySQL daemon already running with the same unix

mysql中的null字段值的处理及大小写问题

在MySQL中,NULL字段的处理,需要注意,当在处理查询条件中有NULL,很有可能你得到的值不是想要的,因为,在MySQL中,判断NULL值相等(=)或者不等(!=)都会返回false.主要出现在常见的SELECT以及WHERE字句中. 为了处理这种特殊的情况,MySQL提供了如下的关键字进行特殊处理: IS NULL: 当列的值是NULL,此运算符返回true. IS NOT NULL: 当列的值不为NULL, 运算符返回true. <=>: 比较操作符(不同于=运算符),当比较的的两个值

mysql探究之null与not null

相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.我字段类型是not null,为什么我可以插入空值 2.为毛not null的效率比null高 3.判断字段不为空的时候,到底要  select * from table where column <> '' 还是要用 select * from table where column is not null 呢. 带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样. 首

Mysql 中is null 和 =null 的区别

在mysql中,筛选非空的时候经常会用到is not null和!=null,这两种方法单从字面上来看感觉是差不多的,其实如 果去运行一下试试的话差别会很大! 为什么会出现这种情况呢? null 表示什么也不是, 不能=.>.< … 所有的判断,结果都是false,所有只能用 is null进行判断.默认情况下,推荐使用 IS NOT NULL去判断,因为SQL默认情况下对!= Null的判断会永远返回0行,但没有语法错误 .如果你一定想要使用!= Null来判断,需要加上这个语句: set

关于MySQL数据库中null的那些事

在mysql数据库中,null是一个经常出现的情况,关于mysql中的null,有哪些注意事项呢?下面简单总结归纳下,后续会不断补充. 1. is null 首先判断数据库中某一列的值是否为null,不能用等于来判断,必须使用 is.比如,select * from users where user_name is null 或者  select * from users where user_name is not null,而不能是 select * from users where use

mysql中的NULL的判断

  mysql> delete from `zhangchao` where x='NULL'; Query OK, 0 rows affected (0.00 sec) mysql> delete from `zhangchao` where x=NULL; Query OK, 0 rows affected (0.00 sec) mysql> select * from zhangchao; +------+-------+ | x | y | +------+-------+ |

Mysql整数运算NULL值处理注意点

CleverCode最近在导出报表的时候,在整数做减法的时候,发现整数减去null得到是null.这是一个细节问题,希望大家以后注意. 1 表中的数据 total,used都是整形,允许为空. 2 有问题的运算语句 减法问题 select id, total, used, (total - used) as have from test_table 3 正确的写法 使用ifnull,来处理null. select id, ifnull(total,0) as total, ifnull(used

MySQL timestamp NOT NULL插入NULL的问题

explicit_defaults_for_timestamp MySQL 5.6版本引入 explicit_defaults_for_timestamp 来控制对timestamp NULL值的处理 如果该参数不开启,则对timestamp NOT NULL插入NULL值,不报错,无warning,插入后的值为当前时间 如果在my.cnf中explicit_defaults_for_timestamp=1 那么插入该值的时候会报错提示该列can not be null 建议开启该值 mysql