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数据不一致,所以还是建议删除从新同步,这样能保证数据是一致的,但是解决问题的时间就长了,

请使用浏览器的分享功能分享到微信等