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