一個奇怪的問題:Last_Errno: 1264 Error 'Out of range value for column 0x322E36343030
場景環境:
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
一個奇怪的問題:Last_Errno: 1264 Error 'Out of range value for column 0x322E36343030