tidb之dm叢集同步異常處理
問題描述:
tidb 4.0.8+dm 1.0
正在同步中的某個task任務:具體有如下的表
task_3324.yaml
- db-name: "glsdb"
tbl-name: "ygz_rate_config"
- db-name: "glsdb"
tbl-name: "tax_entry_tmp_hst"
- db-name: "glsdb"
tbl-name: "ygz_fin_manual_entry"
- db-name: "glsdb"
tbl-name: "subject_item"
- db-name: "glsdb"
tbl-name: "ygz_tax_entry_sum"
- db-name: "glsdb"
tbl-name: "tax_entry_sum"
- db-name: "glsdb"
tbl-name: "ygz_tax_entry_hst"
遇到報錯:如下所示
dmctl --master-addr 11.28.11.143:8261 query-error cbms-3324
顯示 Unsupported modify column: can't change decimal column precision
然後嘗試在tidb中直接執行如下的sql,也報錯
mysql> ALTER TABLE `cbms`.`ygz_tax_entry_hst` MODIFY COLUMN `AMT` DECIMAL(19,6) NOT NULL COMMENT '金額';
ERROR 8200 (HY000): Unsupported modify column: can't change decimal column precision
查閱官方文件:確實有一些給MySQL不相容的語句:
MySQL 相容性---4.0
不支援在單個 ALTER TABLE 語句修改多個列,例如:
ALTER TABLE t1 MODIFY col1 BIGINT, MODIFY id BIGINT NOT NULL;ERROR 1105 (HY000): Unsupported multi schema change
不支援有損變更,以及部分資料型別的更改(包括整數改為字串或 BLOB 格式等)。例如:
CREATE TABLE t1 (col1 BIGINT);ALTER TABLE t1 MODIFY col1 INT;ERROR 8200 (HY000): Unsupported modify column length 11 is less than origin 20
不支援修改 decimal 型別的精度。例如:
CREATE TABLE t (a DECIMAL(5, 3));ALTER TABLE t MODIFY COLUMN a DECIMAL(6, 3);ERROR 8200 (HY000): Unsupported modify column: can't change decimal column precision
MySQL 相容性---5.0
不支援使用單個 ALTER TABLE 語句修改多個列,例如:
ALTER TABLE t1 MODIFY col1 BIGINT, MODIFY id BIGINT NOT NULL;ERROR 1105 (HY000): Unsupported multi schema change
不支援修改主鍵列上需要 Reorg-Data 的型別,但是支援修改 Meta-Only 的型別。例如:
CREATE TABLE t (a int primary key);ALTER TABLE t MODIFY COLUMN a VARCHAR(10);ERROR 8200 (HY000): Unsupported modify column: column has primary key flag
CREATE TABLE t (a int primary key);ALTER TABLE t MODIFY COLUMN a bigint;Query OK, 0 rows affected (0.01 sec)
不支援修改生成列的型別。例如:
CREATE TABLE t (a INT, b INT as (a+1));ALTER TABLE t MODIFY COLUMN b VARCHAR(10);ERROR 8200 (HY000): Unsupported modify column: column is generated
不支援修改分割槽表上的列型別。例如:
CREATE TABLE t (c1 INT, c2 INT, c3 INT) partition by range columns(c1) ( partition p0 values less than (10), partition p1 values less than (maxvalue));ALTER TABLE t MODIFY COLUMN c1 DATETIME;ERROR 8200 (HY000): Unsupported modify column: table is partition table
不支援部分資料型別(例如,部分時間型別、Bit、Set、Enum、JSON 等)的變更,因為 TiDB cast 函式與 MySQL 的行為有一些相容性問題。例如:
CREATE TABLE t (a DECIMAL(13, 7));ALTER TABLE t MODIFY COLUMN a DATETIME;ERROR 8200 (HY000): Unsupported modify column: change from original type decimal(13,7) to datetime is currently unsupported yet
遇到這種情況只能在tidb中從新建立這個表,並且從新建立一個task用來單獨同步這個表
具體操作如下:
1)關閉task_3324.yaml的任務:
dmctl --master-addr 11.28.11.143:8261 stop-task cbms-3324
2)把報錯的表從task_3324.yaml配置檔案中刪除:注意修改配置remove-meta: false
3)啟動task_3324.yaml的任務
dmctl --master-addr 11.28.11.143:8261 start-task /home/tidb/dm-ansible-v1.0.6/resources/conf/task_3324.yaml
4)從新建立一個新的task名字為task_3324_2.yaml
task_3324_2.yaml配置如下:
- db-name: "glsdb"
tbl-name: "ygz_tax_entry_hst"
5)從tidb中刪除報錯的表:
SQL>drop table ygz_tax_entry_hst;
6)從新建立下ygz_tax_entry_hst表,
注意保證給上游MySQL的結構一樣;(重點是需要修改的那個decimal的欄位)
7)最後啟動task_3324_2.yaml
dmctl --master-addr 11.28.11.143:8261 start-task /home/tidb/dm-ansible-v1.0.6/resources/conf/task_3324_2.yaml
8)檢查task_3324.yaml和task_3324_2.yaml這倆任務的狀態
總結:遇到這種錯誤,要不選擇跳過這個sql,要不就得刪除表從新同步,但是跳過這個sql,就可能導致精度不對,和上游MySQL資料不一致,所以還是建議刪除從新同步,這樣能保證資料是一致的,但是解決問題的時間就長了,
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2861669/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- tidb之dm叢集跳過某個事務實踐TiDB
- TiDB DM同步報錯ErrCode 44006處理一例TiDB
- tidb dm叢集修改某個dm-worker的儲存目錄TiDB
- 異常處理機制(二)之異常處理與捕獲
- NodeJS之異常處理NodeJS
- Oracle Linux 6.7中 Oracle 11.2.0.4 RAC叢集CRS異常處理OracleLinux
- 異常篇——異常處理
- Java之異常處理try{}catch(){}Java
- python異常處理之returnPython
- Reactor詳解之:異常處理React
- JAVA學習之異常處理Java
- 溫故之.NET異常處理
- Hprose-java之異常處理ROSJava
- Node.js之異常處理Node.js
- 異常處理
- TIDB DM資料同步step by stepTiDB
- DM 是如何處理 DML 的丨TiDB 工具分享TiDB
- MYSQL 主從庫同步 異常處理彙總MySql
- Flask開發技巧之異常處理Flask
- python 基礎之異常處理Python
- 【java學習之再遇異常處理】Java
- 異常-throws的方式處理異常
- 異常處理與異常函式函式
- JavaScript 異常處理JavaScript
- ThinkPHP 異常處理PHP
- React 異常處理React
- 08、異常處理
- JAVA 異常處理Java
- JAVA異常處理Java
- Abp 異常處理
- oracle異常處理Oracle
- PowerShell 異常處理
- plsql異常處理SQL
- Swift 異常處理Swift
- JS異常處理JS
- app異常處理APP
- Oracle 處理異常Oracle
- MySQL異常處理MySql