数据库里没有这个表我们的SQL没有操作这个DEL表,但在执行EXECUTE stmt时出现报错Table 'dop_users./DEL' doesn't exist"

【 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 脚本中可能存在错误,导致无法找到表。

这个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以后才有这个问题

那就可能是兼容性问题,Supported databases and versions - Flyway - Product Documentation
flyway官网写的兼容版本是5.0

开启general_log日志,然后执行看看,如果报错,去tidb.log里能找到报错对应的原始sql语句。

我试试

根据这个关键字能查到么?

image
查不到

看描述就是这个日志吧

不是这里,是tidb.log文件里搜general_log。

我们日志都输出在标准输出里

找到原因了,用了prepare + execute的语句里表名没有加反引号会报这个错, 字段名没加反引号也会报差不多的错误

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