timestamp 数据类型在 sql_mode 主从不一致引起的不同步问题解决
從節點同步出錯。
無法同步,查看錯誤
Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 0 failed executing transaction ‘1c434876-08ed-11e9-b38c-7cd30aeb7e0a:518868’ at master log mysql-bin.000011, end_log_pos 518868. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
表結構定義為:
-> `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', -> `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',查看binlog 此表插入數據為:
@39=1548833343 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */@40=1548833343 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */最后2字段 定義類型為timestamp.而因為此數據類型保存是為一個時間戳,
主節點的sql_mode
mysql> show variables like 'sql_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_mode | | +---------------+-------+ 1 row in set (0.00 sec)從節點的sql_mode
mysql> show variables like 'sql_mode'; +---------------+--------------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +---------------+--------------------------------------------+ 1 row in set (0.00 sec)原因分析:
timestamp 數據類型是mysql 版本及sql_mode 影響的一個數據類型,相關內容這里不再細說。
時間戳數據存取
在MySQL上述三個大版本中,默認時間戳(Timestamp)類型的取值范圍為’1970-01-01 00:00:01’ UTC 至’2038-01-19 03:14:07’ UTC,數據精確到秒級別,該取值范圍包含約22億個數值,因此在MySQL內部使用4個字節INT類型來存放時間戳數據:
1、在存儲時間戳數據時,先將本地時區時間轉換為UTC時區時間,再將UTC時區時間轉換為INT格式的毫秒值(使用UNIX_TIMESTAMP函數),然后存放到數據庫中。2、在讀取時間戳數據時,先將INT格式的毫秒值轉換為UTC時區時間(使用FROM_UNIXTIME函數),然后再轉換為本地時區時間,最后返回給客戶端。所以在binlog 日志中,可以看到sql 語句中。數據值是:1548833343 。而從節點 sql_mode=STRICT_TRANS_TABLES .
在嚴格模式下,類型轉換出錯了。
解決方法是把sql_mode 修改和主節點一致后, 重啟從節點。可解決問題。
總結
以上是生活随笔為你收集整理的timestamp 数据类型在 sql_mode 主从不一致引起的不同步问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL从节点延迟问题原因及解决
- 下一篇: 参数binlog_rows_query_