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
相關文章
- FAQ系列|寫新資料時某列值總是被自動修改
- mysql臨時表空間不夠導致主從複製失敗MySql
- Linux主機名修改後導致mysql重啟失敗LinuxMySql
- sock鎖檔案導致的MySQL啟動失敗MySql
- FAQ系列|如何保證主從複製資料一致性
- 陣列(引用型別)複製問題陣列型別
- selenium-java被檢測導致滑塊驗證失敗Java
- 各種失敗型別型別
- MySQL複製FAQMySql
- RAC環境中修改系統時間可能導致SRVCTL命令失敗
- MySQL 5.7複製配置不規範修改導致的坑(一)MySql
- RAC oracle 許可權更改導致 實力啟動失敗Oracle
- Filestream/Windows Share導致Alwayson Failover失敗WindowsAI
- LONG型別複製型別
- /etc/fstab的錯誤設定導致系統啟動失敗
- Oracle 失敗的6種型別Oracle型別
- 故障分析 | DDL 導致的 Xtrabackup 備份失敗
- 源設定導致Docker映象構建失敗Docker
- 獲取導致匯入失敗的資料
- stream pool設定過小導致impdp失敗
- selinux導致sqlplus登入失敗LinuxSQL
- Cypress系列(65)- 測試執行失敗自動重試
- beego自動建表失敗Go
- ORACLE自動重編譯包導致查詢被卡Oracle編譯
- /dev/bpf裝置缺失導致RAC安裝時HAIP啟動失敗devAI
- 一次密碼檔案丟失導致的dataguard複製中斷密碼
- TestNg 失敗用例重試自動被 ignored 怎麼辦?
- AIX 5.3 重啟系統後VG PERMISSION被改變導致Oracle10.2.0.5叢集啟動失敗AIOracle
- springboot衝突導致的發版失敗Spring Boot
- Docker 導致阿里雲 ECS 內網互通失敗Docker阿里內網
- 獲取導致匯入失敗的資料(五)
- 獲取導致匯入失敗的資料(四)
- 獲取導致匯入失敗的資料(三)
- 獲取導致匯入失敗的資料(二)
- 糟糕的範圍管理導致專案失敗(轉)
- Java ibatis配置問題導致Myeclipse啟動web專案失敗JavaBATEclipseWeb
- 由adoacorectl.sh啟動失敗導致網頁無法顯示網頁
- 微軟披露細節:重複進入UEFI導致英特爾SSD升Windows 10失敗微軟Windows