修改datetime精度导致tiflash查询报错

对表执行了修改datetime精度(之前默认datetime),如:alter table my_table order_date datetime(6);然后查tifalsh就报错了,重新把表剔除tiflash后重建也不行。。,请教下怎么破这类问题?

MySQL [test_db]> select * from information_schema.tiflash_replica;
±----------------------±----------------±---------±--------------±----------------±----------±---------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS |
±----------------------±----------------±---------±--------------±----------------±----------±---------+
| test_db | my_table | 18560 | 1 | | 1 | 1 |
±----------------------±----------------±---------±--------------±----------------±----------±---------+
1 row in set (0.015 sec)

MySQL [test_db]> desc my_table;
±--------------±------------±-----±-----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------------±------------±-----±-----±--------±------+
| order_date | datetime(6) | YES | | NULL | |
| out_seri | int(11) | NO | | NULL | |
| dept_code | varchar(7) | YES | | NULL | |
| ward_code | varchar(7) | YES | | NULL | |
| section_code | varchar(7) | YES | | NULL | |
| inpatient_no | varchar(12) | NO | MUL | NULL | |
| name | varchar(32) | NO | | NULL | |
| bed_no | varchar(4) | YES | | NULL | |
| charge_code | varchar(6) | NO | MUL | NULL | |
| retprice | double | NO | | NULL | |
| amount | double | NO | | NULL | |
| infant_flag | varchar(1) | YES | | NULL | |
| drawer | varchar(5) | YES | | NULL | |
| keeper | varchar(5) | YES | | NULL | |
| date1 | datetime(6) | YES | | NULL | |
| date2 | datetime(6) | YES | | NULL | |
| always_flag | varchar(1) | NO | | NULL | |
| drug_class | varchar(1) | YES | | NULL | |
| acct_sign | varchar(1) | YES | | NULL | |
| total_flag | varchar(1) | YES | | NULL | |
| admiss_times | smallint(6) | YES | | NULL | |
| supply_code | varchar(1) | YES | | NULL | |
| act_order_no | double | YES | MUL | NULL | |
| page_no | double | YES | | NULL | |
| self_flag | varchar(1) | YES | | NULL | |
| separate_flag | varchar(1) | YES | | NULL | |
| suprice_flag | varchar(1) | YES | | NULL | |
| drug_flag | varchar(1) | YES | | NULL | |
| pay_self | varchar(1) | YES | | NULL | |
| group_no | varchar(2) | YES | | NULL | |
| confirm_time | datetime(6) | YES | MUL | NULL | |
| serial | varchar(2) | YES | | NULL | |
| doctor_name | varchar(5) | YES | | NULL | |
±--------------±------------±-----±-----±--------±------+
33 rows in set (0.001 sec)

MySQL [test_db]> explain select count(0) from my_table where confirm_time >‘2021-01-01’;
±-----------------------------±------------±------------------±----------------------±-----------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
±-----------------------------±------------±------------------±----------------------±-----------------------------------------------------------------------------------+
| StreamAgg_27 | 1.00 | root | | funcs:count(Column#38)->Column#35 |
| └─TableReader_28 | 1.00 | root | | data:StreamAgg_11 |
| └─StreamAgg_11 | 1.00 | batchCop[tiflash] | | funcs:count(0)->Column#38 |
| └─Selection_26 | 20418375.92 | batchCop[tiflash] | | gt(test_db.my_table.confirm_time, 2021-01-01 00:00:00.000000) |
| └─TableFullScan_25 | 26628350.00 | batchCop[tiflash] | table:my_table | keep order:false |
±-----------------------------±------------±------------------±----------------------±-----------------------------------------------------------------------------------+
5 rows in set (0.028 sec)

MySQL [test_db]> select count(0) from my_table where confirm_time >‘2021-01-01’;
ERROR 1105 (HY000): Check schema[i].type->equals(*storage_schema[i].type) failed, schema[i].name = table_scan_0, schema[i].type->getName() = Nullable(MyDateTime(6)), storage_schema[i].name = confirm_time, storage_schema[i].type->getName() = Nullable(MyDateTime(0))
MySQL [test_db]>

自己回复一下:
tiflash初始化时会将表的元数据抓取到自己的metadata目录,怀疑是修改datetime(6)精度后元数据没有更新导致。卸载tiflash后,重新把表添加到tiflash,查询就正常了.

遇到的错误表明表定义与列confirm_time 的TiFlash 存储架构之间存在架构不匹配。 看来当将日期时间列的精度从默认日期时间修改为日期时间(6)时,TiFlash 仍然期望旧的日期时间类型。

要解决此问题,需要更新 TiFlash 表的存储架构以匹配新的 datetime(6) 定义。 请按照以下步骤解决问题:

使用以下命令检查 TiFlash 表的当前存储模式:

SELECT * FROM information_schema.tiflash_replica;

确认存储架构中的确认时间列仍定义为 datetime(0)。 这可能是架构不匹配的原因。

要更新 TiFlash 存储架构,可以按照以下步骤操作:

A。 禁用受影响表的 TiFlash 副本:

更改表 my_table 设置 TIFLASH REPLICA 0;

b. 删除 TiFlash 副本:

更改表 my_table 删除 TIFLASH 副本;

C。 使用更新后的架构重新创建 TiFlash 副本:

更改表 my_table 设置 TIFLASH REPLICA 1;

执行这些步骤后,应使用更新的架构重新创建 TiFlash 副本,并且应解决错误。 然后,可以尝试再次运行查询以验证其是否按预期工作。

请注意,修改 TiFlash 存储架构可能会影响 TiFlash 的性能和数据复制,因此请确保在维护时段或在适当的时间执行这些更改。 此外,在进行架构更改之前备份数据是一个很好的做法。

1 个赞

学习了。。

Hold on,tiflash 对哪些 ddl 需要这种操作?

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。