前言

错误信息如下 

Error on rename of './test_02/tz_test_updated' to './test_02/tz_test_tmp' (errno: 184 - Tablespace already exists)

当我 看到这个的时候, 去查询了一下 information_schema 中的 INNODB_SYS_TABLES 和 INNODB_SYS_TABLESPACES 的信息, 可以看到 找不到对应的 tz_test_tmp

但是 却报了这个错误, 所以 我推测 应该需要去 服务器上面查看 数据目录, 是否有 tz_test_tmp 相关的 frm 或者 idb, 但是数据库 不是我们的, 因此 无法验证这个

因此 我只能 在本地 尝试复现这个问题

然后 拷贝 tz_test.idb 为 tz_test_tmp.idb 文件, 然后 将另外一张表 更新为 tz_test_tmp, 然后 就复现了问题

然后 比如你拷贝了 frm 和 idb 文件, 那么 报告的错误时 table already exists, 和这个是不一样的 

当然 可以判断出的问题是 应该是服务器在某一时刻出现了异常, tz_test_tmp 的 frm 文件已经删除了, 但是 idb 文件还未删除 

 

 

Error on rename of './test_02/tz_test_updated' to './test_02/tz_test_tmp' (errno: 184 - Tablespace already exists)

执行 sql 如下 “alter table tz_test_updated rename to tz_test_tmp;”

复现的方式如上, 我们来看一下 这个错误的整体流程

这里主要是检查到 新的数据表文件 如果已经存在, 则响应了 DB_TABLESPACE_EXISTS

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_数据库

 

Innobase::rename_table 有一层错误码的转换, 将 DB_TABLESPACE_EXISTS 转换为了 HA_ERR_TABLE_SPACE_EXISTS

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_错误信息_02

 

然后 接着是 根据上下文, 以及错误信息模板, 封装错误信息 返回

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_SYS_03

 

Table 'tz_test_02' already exists

假设执行 sql 如下 “alter table tz_test_updated rename to tz_test_02;”

tz_test_02 的 frm, idb 已经存在, 然后 会响应 如上错误信息

然后 尝试 access 新文件的 frm 信息的时候, 失败 

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_错误信息_04

 

调用上下文如下, 可以看到 访问的文件是 tz_test_02.frm 

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_SYS_05

 

封装错误信息如下, 返回 Table already exists

47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)_服务器_06

 

 

完