mysql log 记录报错 sql语句_MySQL生产库中添加修改表字段引起主从崩溃的问题总结...
上周末和开发人员对线上库中的部分表的在线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生产库中添加修改表字段引起主从崩溃的问题总结...相关推荐
- mysql建库sql语句_mysql建库和建表的sql语句
需求描述: 在用户提交酒店订单时,需要记录订单信息和订单日志:订单信息包括用户名.订单号.入住时间和离店时间: 订单日志包括谁在什么时候操作了该订单,下订单时需要记录的订单日志为系统在下订单的时间点创 ...
- mysql工具记录用户的查询语句_MySQL数据库的常用命令语句记录——安全用户语句及函数...
安全用户语句及函数 CREATE USER:创建用户 CREATE USER 'user'[@'host'] [ IDENTIFIED BY [PASSWORD] 'password'][,....] ...
- mysql 主键 sql语句_Mysql 增加主键或者修改主键的sql语句操作
添加表字段 alter table table1 add transactor varchar(10) not null; alter table table1 add id int unsigned ...
- mysql创建用户表的sql语句_Mysql创建、删除用户和表的SQL语句
Mysql创建.删除用户和表的SQL语句 (2015-01-15 17:08:17) 标签: it 联动北方 数据库 分类: IT MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意 ...
- mysql创建备份表的sql语句_mysql 备份语句
模板: mysqldump -h IP -u user -p 选项 dbname>d:\db.sql 选项:-f表示有错误时继续 -d 表示--no-create-db, -n表示--no-da ...
- mysql数据库的注释语句是_coding++ :MySQL 使用 SQL 语句查询数据库所有表注释已经表字段注释...
1.要查询数据库 "mammothcode" 下所有表名以及表注释 /*查询数据库 'mammothcode' 所有表注释*/SELECT TABLE_NAME,TABLE_COM ...
- mysql使用sql语句查询数据库所有表注释已经表字段注释
场景: 1. 要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 'mammothcode' 所有表注释 */ SELECT TABLE_NAME,T ...
- mysql存储过程是不是不能穿sql语句_mysql存储过程能不能直接执行拼接的sql语句...
展开全部 当然可以,就是在mysql存储过程中使用动态sql,就可以拼接sql,然62616964757a686964616fe58685e5aeb931333361323562后执行了. 给你复制一 ...
- GORM报错sql: Scan called without calling Next
@GORM报错sql: Scan called without calling NextTOC GORM报错sql: Scan called without calling Next 使用gorm操作 ...
最新文章
- crushmap磁盘智能分组
- pyqt5窗口之间传递信号_pyQT5 实现窗体之间传值的示例
- 【VOC格式xml文件解析】——Python
- 卖萌屋新闻联播栏目,倾情上线~
- 编程语言_如何正确地学习编程语言
- 括号匹配问题(C++、堆栈)
- 在asp.net2.0中使用存储过程
- 一个U盘走天下,装机大神撩妹的不二之选
- 微软Windows7将捆绑杀软 众厂商面临生死抉择
- c# chart 各个属性_C#之Chart控件系列教程
- Windows下使用FreeSSL刷新网络安全证书
- caffe安装出现 “error : too few arguments in function call” 的错误
- python统计指定数字和_Python实现统计给定列表中指定数字出现次数的方法
- Web Audio API与WebSocket播放实时音频
- 打开我的电脑出现不支持此接口
- 汽车电子EMC实验简介
- 区块链每日快讯(0116)
- CSS选择器之复合选择器
- 初链TrueChain(TRUE)
- matlab画二维图彩图,matlab二维图形绘制.pdf
热门文章
- 无聊说说 strong VS weak
- 今天的一切准备就绪的局域网聊天
- 『转』度百死去飞秋一个BUG引发的血案
- 腾讯竞购ICQ或失败!
- 年轻人,莫把技术当全部
- 大数据时代,前端开发者该如何提升自身竞争力(附教程视频)
- php168为什么抛弃重新开发x1,在今天518这个特别的日子里,我们经过将近一年来,日以继夜努力研发出的X1正式对外公开发布!...
- mysql存储过程执行update_MySQL存储过程实现动态执行SQL
- caffe与tensorflow框架下卷积的维度计算与一致性证明
- fcpx插件:Beautiful Slideshow - 时尚简洁图片幻灯片开场