FAQ系列|列型別被自動修改導致複製失敗
0、導讀
在複製環境中,有個表的列型別總是被修改,導致複製程式報錯停止
1、問題描述
問題發生在朋友的資料庫上,做了主從複製,其中某表有一列型別是INT,但是該表上的INSERT事件在BINLOG中卻總被記錄為MEDIUMINT型別,導致這個事件在SLAVE上執行失敗。
相關現場資訊見下:
MySQL版本:官方5.5.版本。
表DDL定義:
CREATE TABLE `t` (
`userid` int(10) unsigned NOT NULL DEFAULT 0,
這個表上的INSERT事件在BINLOG中的記錄:
### INSERT INTO `imysql`.`t`
### SET
### @1=207 /* MEDIUMINT meta=0 nullable=0 is_null=0 */
我們看到BINLOG中,這個列型別顯示為MEDIUMINT,這個事件在SLAVE上就會報告下面的錯誤,導致SLAVE無法繼續複製:
Column 0 of table `imysql.t` cannot be converted from type `mediumint` to type `int(10) unsigned
又是一個看起來很奇葩的案例。
2、原因分析
經過溝通排查,瞭解到他們的業務模式有點特殊,是從一箇舊的空表中複製表結構生成每天日誌表,然後再將當天的日誌寫入該表。也就是大概做法是:
1、建立每天日誌表
CREATE TABLE t SELECT t_orig;
2、寫入日誌
INSERT INTO t SELECT * FROM t_orig;
其實問題就出在每天建立新表的過程中,源表結構像是這樣的:
CREATE TABLE `t_orig` (
`userid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
從源表複製到新表之後,又執行了ALTER TABLE,把 userid 列型別從 MEDIUMINT 改為 INT,建立儲存過程等其他工作。
生成新表後,再寫入生成的日誌。但是呢,寫入日誌卻又是採用INSERT…SELECT的用法。一般情況下當然沒問題,但這個例子中,源表、目標表的 userid 列型別恰好不一樣(源是MEDIUMINT,目標是INT),結果導致在 binglog 中記錄event時,將 userid 列型別強制轉換為 MEDIUMINT 了。這個 INSERT 在 MASTER 端可以正常執行完畢,但卻引發了 SLAVE 檢測到二者資料型別不一致,寫入失敗,複製異常中斷。
3、問題建議
遇到這種案例也真的是醉了,從源表每天克隆一個新表做法沒問題,採用INSERT…SELECT也沒問題,但為啥要源表和新表使用不同資料型別呢,直接把源表的也改成INT不就行了嗎,只能說某些人懶得不像樣了。
4、類似案例
文章轉自老葉茶館公眾號,原文連結:https://mp.weixin.qq.com/s/fI3zdn7D4JOb8RPeImfbDQ
相關文章
- FORTRAN動態陣列分配失敗導致執行時Access Violation陣列
- selenium-java被檢測導致滑塊驗證失敗Java
- springboot 介面引數型別為LocalDateTime解析失敗導致介面報錯 -解決Spring Boot型別LDA
- sock鎖檔案導致的MySQL啟動失敗MySql
- 陣列(引用型別)複製問題陣列型別
- 淺複製導致的bug
- springboot衝突導致的發版失敗Spring Boot
- Docker 導致阿里雲 ECS 內網互通失敗Docker阿里內網
- 故障分析 | DDL 導致的 Xtrabackup 備份失敗
- TestNg 失敗用例重試自動被 ignored 怎麼辦?
- Cypress系列(65)- 測試執行失敗自動重試
- beego自動建表失敗Go
- 迴圈引用導致的json序列化失敗JSON
- rman備份的時候讀取v$session_longops失敗導致備份失敗SessionGo
- 微軟披露細節:重複進入UEFI導致英特爾SSD升Windows 10失敗微軟Windows
- 解決一次gitlab因異常關機導致啟動失敗Gitlab
- Kafka消費者自動提交配置會導致潛在的重複或資料丟失!Kafka
- Spring 自動注入失敗異常Spring
- MongoDB例項重啟失敗探究(大事務Redo導致)MongoDB
- 企業使用ERP系統導致失敗的因素所在
- Day 7.5 資料型別總結 + 複製 淺複製 深複製資料型別
- MySQL主從複製錯誤——列型別轉換錯誤MySql型別
- 【FAQ】獲取Push Token失敗,如何進行排查?
- LightDB/Postgresql 記錄客戶端啟動版本問題導致啟動失敗問題SQL客戶端
- MySQL 網路導致的複製報錯案例MySql
- 儲存互斥失敗導致資料丟失的資料恢復成功案例資料恢復
- 深入解析C++的auto自動型別推導C++型別
- 匿名內部類方式構建物件導致序列化失敗物件
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- 開啟 Keep-Alive 可能會導致http 請求偶發失敗Keep-AliveHTTP
- wait_type SOS_WORKER導致資料庫連線失敗AI資料庫
- MQ消費失敗,自動重試思路MQ
- namenode單節點啟動成功後自動消失/格式化失敗/fsimage載入失敗
- Python自動複製Excel資料:將各行分別重複指定次數PythonExcel
- 痞子衡嵌入式:系統時鐘配置不當會導致i.MXRT1xxx系列下OTFAD加密啟動失敗加密
- Drive客戶端因SSL證書已更改導致聯機失敗客戶端
- MySQL8.0的一個bug導致複製延時MySql
- 自動化測試專案為何失敗
- 爬蟲代理IP自動分配失敗的原因爬蟲