场景环境:
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
从库在应用主库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