上周末和开发人员对线上库中的部分表的在线DDL和update,这过程中出现了一些意料之外的问题,现将过程、分析和解决方案在这里总结一下

一、 需求背景:

要在如下表中添加字段(modified_at)并且更改默认值

table_name {

baby_comp

baby_comp_status

baby_usr

baby_ad_user

baby_camp

baby_ord

baby_acc_eva

}

每张表执行如下操作

ALTER TABLE `$table_name` ADD COLUMN `modified_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘创建时间/最后修改时间‘");

更新的语句

UPDATE `baby_camp`

SET `modified_at` = FROM_UNIXTIME(updated_time + 60)

WHERE `modified_at` <= ‘1970-01-01 08:00:00‘;

二、 数据库架构

master:192.168.100.18 >主库写数据复制源

slave1:192.168.100.17 >搜索用

slave2:192.168.100.19 >查询用

slave3:192.168.100.10 >查询用

slave4:192.168.100.15 >备份用

三、故障的相关信息截取:

问题 1. max binlog cache 不足引起的复制崩溃 涉及从库(192.168.100.17-搜索用 和 192.168.100.15-备份用)

161009 21:42:49 [ERROR] Slave SQL: Could not execute Write_rows event on table baby.baby_delta; 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 mysql-bin.007759, end_log_pos 3856759100, Error_code: 1197

161009 21:42:49 [Warning] Slave: Multi-statement transaction required more than ‘max_binlog_cache_size‘ bytes of storage; increase this mysqld variable and try again Error_code: 1197

161009 21:42:49 [Warning] Slave: Writing one row to the row-based binary log failed Error_code: 1534

161009 21:42:49 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log ‘mysql-bin.007759‘ position 633959791

161009 21:43:48 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)

161009 21:43:48 [Note] Slave I/O thread killed while reading event

161009 21:43:48 [Note] Slave I/O thread exiting, read up to log ‘mysql-bin.007760‘, position 301659

161009 21:43:53 [Note] Slave SQL thread initialized, starting replication in log ‘mysql-bin.007759‘ at position 633959791, relay log ‘./serverdb01-relay-bin.009618‘ position: 633959937

161009 21:43:53 [Note] Slave I/O thread: connected to master ‘[email protected]:3306‘,replication started in log ‘mysql-bin.007760‘ at position 301659

++++

解释:

报错主要是:从库上对于表baby.baby_delta的操作不能写到binlog中,多语句的事物请求更多的max_binlog_cache_szie,增加max_binlog_cache_szie大小重试

++++

问题 2. max allowed packet 不足引起的复制崩溃 涉及从库(192.168.100.15-备份用)

161009 21:42:49 [ERROR] Error reading packet from server: log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master (server_errno=1236) 131118

161009 21:42:49 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: ‘log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master‘, Error_code: 1236

++++

解释:

报错主要是:从库读取主库的binlog的packet的大小超出了设定的max_allowed_packet大小,在主库上增加此参数的值。

++++

四、 原因分析:

首先单独操作了表:baby_ord, 此表数据量大大概4百多万的数据条目.

其中在此表上有多个触发器涉及到INSERT\UPDATE\DELETE操作,会触发将相应的数据行插入到baby_delta表中,执行完除了主从延时并没有出现其他的状况

于是过于乐观的认为余下的表没有太大的数据量,除了主从延迟,不会造成其他的问题,索性就全部放在了集中一次发布中修改.

在DBMigrate后监控SQL在主库的执行,主库正常执行完成,从库17和15出现复制崩溃.

查看变更完最后一批表后的binlog大小,其中mysql-bin.007759这一文件达到了将近9G,配置文件中限定产生的binlog文件的最大大小是1G

因为后面一批的表字段添加变更执行是一个事务,同一个事务产生的binlog不会被分配到两个binlog文件中.导致出现上述问题 1和2

事后发现babysitter_campagin 表物理文件有6G大小,其中有几个列的数据类型是text.

但为什么binlog文件会变得这么大呢?超出了限定大小?

因为主库配置的binlog的格式是mixed,由系统根据SQL的类型判断是记录row格式还是stmt格式,但默认是记录stmt格式的,那什么时候会记录

row格式呢?

1.当SQL语句是update或者delete

row格式的缺点就是将每条数据的变化都详细的记录下来,结果就是binlog文件很大,会占用更大的binlog cache.

mysql> show master logs;

+------------------+------------+

| Log_name | File_size |

+------------------+------------+

| mysql-bin.007758 | 2514487585 |

| mysql-bin.007759 | 9107651572 |

+------------------+------------+

mysql> desc baby_camp;

+-----------------------------------+-----------------------+------+-----+-------------------+-----------------------------+

| Field | Type | Null | Key | Default | Extra |

+-----------------------------------+-----------------------+------+-----+-------------------+-----------------------------+

| content | mediumtext | YES | | NULL | |

| tweet_url | text | YES | | NULL | |

| note | text | YES | | NULL | |

| requirement | text | YES | | NULL | |

省略了部分内容。。。。

+-----------------------------------+-----------------------+------+-----+-------------------+-----------------------------+

mysql> select count(*) from baby_camp;

+----------+

| count(*) |

+----------+

| 1131460 |

+----------+

1 row in set (0.50 sec)

mysql> select count(*) from baby_delta;

+----------+

| count(*) |

+----------+

| 10136301 |

+----------+

1 row in set (1.12 sec)

五、再次有添加变更列,类型的需求的解决方案:

1.能不增加、不修改表列或者默认值尽量不要做,要求似乎不合情理啊,该做的还得做:(

2.多个表要变更字段等操作分批处理,减少binlog的产生,虽然麻烦一些,安全稳定重要

3.没有办法的办法就是暴力改动数据库的参数,缺点是有些参数需要重启数据库实例

六、疑惑之处:

复制的源主库只有一个,其中17和15出现复制崩溃(注:都开启了binlog,且格式是row,都会出现问题1,但是只有15问题1和2都出现了),而查询专用的19和10两从库(注:两库都没有开启binlog)没有出现问题2,不解?

原文:http://andylhz2009.blog.51cto.com/728703/1861133

mysql log 记录报错 sql语句_MySQL生产库中添加修改表字段引起主从崩溃的问题总结...相关推荐

  1. mysql建库sql语句_mysql建库和建表的sql语句

    需求描述: 在用户提交酒店订单时,需要记录订单信息和订单日志:订单信息包括用户名.订单号.入住时间和离店时间: 订单日志包括谁在什么时候操作了该订单,下订单时需要记录的订单日志为系统在下订单的时间点创 ...

  2. mysql工具记录用户的查询语句_MySQL数据库的常用命令语句记录——安全用户语句及函数...

    安全用户语句及函数 CREATE USER:创建用户 CREATE USER 'user'[@'host'] [ IDENTIFIED BY [PASSWORD] 'password'][,....] ...

  3. mysql 主键 sql语句_Mysql 增加主键或者修改主键的sql语句操作

    添加表字段 alter table table1 add transactor varchar(10) not null; alter table table1 add id int unsigned ...

  4. mysql创建用户表的sql语句_Mysql创建、删除用户和表的SQL语句

    Mysql创建.删除用户和表的SQL语句 (2015-01-15 17:08:17) 标签: it 联动北方 数据库 分类: IT MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意 ...

  5. mysql创建备份表的sql语句_mysql 备份语句

    模板: mysqldump -h IP -u user -p 选项 dbname>d:\db.sql 选项:-f表示有错误时继续 -d 表示--no-create-db, -n表示--no-da ...

  6. mysql数据库的注释语句是_coding++ :MySQL 使用 SQL 语句查询数据库所有表注释已经表字段注释...

    1.要查询数据库 "mammothcode" 下所有表名以及表注释 /*查询数据库 'mammothcode' 所有表注释*/SELECT TABLE_NAME,TABLE_COM ...

  7. mysql使用sql语句查询数据库所有表注释已经表字段注释

    场景: 1. 要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 'mammothcode' 所有表注释 */ SELECT TABLE_NAME,T ...

  8. mysql存储过程是不是不能穿sql语句_mysql存储过程能不能直接执行拼接的sql语句...

    展开全部 当然可以,就是在mysql存储过程中使用动态sql,就可以拼接sql,然62616964757a686964616fe58685e5aeb931333361323562后执行了. 给你复制一 ...

  9. GORM报错sql: Scan called without calling Next

    @GORM报错sql: Scan called without calling NextTOC GORM报错sql: Scan called without calling Next 使用gorm操作 ...

最新文章

  1. crushmap磁盘智能分组
  2. pyqt5窗口之间传递信号_pyQT5 实现窗体之间传值的示例
  3. 【VOC格式xml文件解析】——Python
  4. 卖萌屋新闻联播栏目,倾情上线~
  5. 编程语言_如何正确地学习编程语言
  6. 括号匹配问题(C++、堆栈)
  7. 在asp.net2.0中使用存储过程
  8. 一个U盘走天下,装机大神撩妹的不二之选
  9. 微软Windows7将捆绑杀软 众厂商面临生死抉择
  10. c# chart 各个属性_C#之Chart控件系列教程
  11. Windows下使用FreeSSL刷新网络安全证书
  12. caffe安装出现 “error : too few arguments in function call” 的错误
  13. python统计指定数字和_Python实现统计给定列表中指定数字出现次数的方法
  14. Web Audio API与WebSocket播放实时音频
  15. 打开我的电脑出现不支持此接口
  16. 汽车电子EMC实验简介
  17. 区块链每日快讯(0116)
  18. CSS选择器之复合选择器
  19. 初链TrueChain(TRUE)
  20. matlab画二维图彩图,matlab二维图形绘制.pdf

热门文章

  1. 无聊说说 strong VS weak
  2. 今天的一切准备就绪的局域网聊天
  3. 『转』度百死去飞秋一个BUG引发的血案
  4. 腾讯竞购ICQ或失败!
  5. 年轻人,莫把技术当全部
  6. 大数据时代,前端开发者该如何提升自身竞争力(附教程视频)
  7. php168为什么抛弃重新开发x1,在今天518这个特别的日子里,我们经过将近一年来,日以继夜努力研发出的X1正式对外公开发布!...
  8. mysql存储过程执行update_MySQL存储过程实现动态执行SQL
  9. caffe与tensorflow框架下卷积的维度计算与一致性证明
  10. fcpx插件:Beautiful Slideshow - 时尚简洁图片幻灯片开场