【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】7.1.5
【复现路径】做过哪些操作出现的问题
使用flyway执行sql变更
flyway版本是5.2.4
【遇到的问题:问题现象及影响】
在执行到EXECUTE stmt;时报错Table ‘dop_users./DEL’ doesn’t exist",但是这个库下没有这个表,我们的sql里根本没有操作这个表
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
特殊字符问题:表名中包含特殊字符 /
,导致 Flyway 无法正确识别。
TiDB 的 DDL 行为:在高并发环境下,TiDB 可能未能正确处理表的创建或删除,导致表状态不一致。
配置或脚本错误:Flyway 的配置或 SQL 脚本中可能存在错误,导致无法找到表。
– use dop_users;
SET NAMES utf8;
– 租户表添加一个字段,标识租户所属的专区,可重入
SET @s = (SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ‘tree’
AND column_name = ‘region_id’
) > 0,
“SELECT 1”,
“alter table tree
add column region_id
bigint(11) default null comment ‘所属专区id’;”
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @s = (SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ‘application’
AND column_name = ‘region_id’
) > 0,
“SELECT 1”,
“alter table application
add column region_id
bigint(11) default null comment ‘所属专区id’;”
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
– 创建唯一索引
SET @s =
(
SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.statistics WHERE table_name = ‘tree’ AND index_name = ‘uk_idx_tenant_id_region_id’) > 0,
“SELECT 1”,
“create unique index uk_idx_tenant_id_region_id
on tree (id, region_id);”
)
);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
目前看直接连上去执行是正常的,但是通过flyway执行就会出现一个/DEL表不存在的错误
我们的SQL里完全没有操作/DEL表,数据库也没这个表,不知道怎么出现的
你找个文本编辑工具打开sql文件显示所有字符看看是不是有隐藏特殊字符。
没有,应该不是特殊字符的原因,同样的SQL在6.1.0版本是正常的,升级到7.1.5以后才有这个问题
Kongdom
(Kongdom)
10
开启general_log日志,然后执行看看,如果报错,去tidb.log里能找到报错对应的原始sql语句。
Kongdom
(Kongdom)
16
不是这里,是tidb.log文件里搜general_log。
hpfish
18
找到原因了,用了prepare + execute的语句里表名没有加反引号会报这个错, 字段名没加反引号也会报差不多的错误
system
(system)
关闭
19
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。