木林森2014

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

场景环境:

  1. 主从都是:Server version: 5.7.16-log MySQL Community Server (GPL)

  2.操作系统:CentOS release 6.7 (Final)

  3.业务端通过SAS软件,向改主库中批量写入几百条数据。

 

接到报警,发现从库show slave status \G; 有如下报警

Last_Errno: 1264
Last_Error: Error 'Out of range value for column 'loan_amount' at row 1' on query. Default database: 'chedai'. Query: 'INSERT INTO test_list2 (loan_amount,APPLYUSERGROUPID,lastapplyid,validdate)  VALUES ( 0x322E3634303030303030303030303030303030652B303035 , 0x3131313130313234 , 0x392E3839353230393030303030303030303030652B303036 , 0x323031382D30352D3331 )'
Skip_Counter: 0
View Code

从库在应用主库binlog时,发现实际value超过字段定义长度。但疑问时:为什么主库能成功执行,从库就报错。

从主库查到已经成功插入的数据表为:

+-------------+------------------+-------------+------------+
| loan_amount | APPLYUSERGROUPID | lastapplyid | validdate |
+-------------+------------------+-------------+------------+
| 264000 | 11110124 | 9895209 | 2018-05-31 |
| 80000 | 11110122 | 9896660 | 2018-05-31 |
| 216000 | 11111162 | 9900036 | 2018-05-31 |
| 208000 | 11143122 | 9907101 | 2018-05-31 |
| 176000 | 11121775 | 9922122 | 2018-05-31 |
| 110000 | 11111804 | 9928679 | 2018-05-31 |
| 68800 | 11110963 | 9941918 | 2018-05-31 |
| 68000 | 11143124 | 9944861 | 2018-05-31 |
| 50000 | 11111164 | 9949087 | 2018-05-31 |
| 54000 | 11121640 | 9951020 | 2018-05-31 |
+-------------+------------------+-------------+-----------

解析对应的binlog,确实所有的value都变成了16进制,截图如下:

疑点:为什么mysqlbinlog解析出来value是16进制的。同时也匹配上了slave上的报错信息。

想到这个库的binlog_format设置的是mixed,第一想法是如果改为ROW格式,是否可以规避这个问题呢,如果做了如下测试:

1. mysql>set global binlog_format=row;

2. 叫研发侧的同学按原步骤,重新写入数据。

3.解析对应binlog,结果如下:

至此,mysqlbinlog能正常解析出来,与此同时slave也正常同步上了。

结论:本次环境通过修改binlog_format=row,成功规避掉的了这个问题。同时也建议生产环境设置该参数为row,但是具体是什么原因导致的,之前有文章提到是jdbc版本和mysql server版本兼容的问题,详见:

http://www.itpub.net/forum.php?mod=viewthread&action=printable&tid=1402633

posted on 2018-04-27 11:33  木林森2014  阅读(371)  评论(0编辑  收藏  举报