tidb之dm叢集同步異常處理

賀子_DBA時代發表於2022-03-01

問題描述:

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章