写点什么

GreatSQL 数据库 DROP 表后无法重建

作者:GreatSQL
  • 2024-05-17
    福建
  • 本文字数:919 字

    阅读完需:约 3 分钟

一、数据库信息:

数据库版本:5.7.21-log


某银行测试数据库,APP 业务库内有一个含有大量(几百个)分区表的大表 test_app。DROP 该分区表的大表后导致无法重建该分区表。

二、问题描述:

  客户使用“drop table test_app;”时,显示表删除成功。当重新执行该表的建表语句时,报错“Table 'app.test_app /* Partition p0 */' already exists”

三、问题分析:

3.1> 原因是 GreatSQL 5.7 数据库 DDL 没有原子性,drop 表的删除动作没有执行完成;


3.2> 进入数据库“show tables”查看 test_app 表已不存在;


3.3> 进入数据库所在的目录下,查看 test_app 表的相关文件。test_app.frm 文件已不存在,但是有大量的"test_app#P***.ibd"分区表文件存在。关闭数据库,移除这些分区表文件到其他目录,启动数据库;数据库无法启动,报“无法找到这些分区表文件”的错误;


3.4> 重新创建 test_app 表时,报“table already exists”错。


3.5> 感觉进入了死胡同,最先想到的直截了当方法是备份 APP 业务库内除这张表的其他表,删除该数据库后,进行 APP 业务数据库的恢复,该方法没有测试,觉得太麻烦。

四、问题处理(方法一,测试步骤):

4.1> 新建一个临时库 test,依据 app 库目录里的数据文件名称,修改建表语句后,执行 test_app 表的建表 SQL 语句,生成 test_app.frm 文件;


4.2> 关闭数据库,修改数据库配置文件 my.cnf 文件的参数为“innodb_file_per_table=OFF”;


4.3> 把临时库 test 目录下的 test_app.frm 文件拷贝到业务数据库 app 目录下,启动数据库;


4.4> 进入业务数据库 APP,可以看到 test_app 表;


4.5> 执行“drop table test_app;”语句,成功删除了表。关闭数据库;


4.6> 进入业务数据库 app 对应的目录下,test_app.frm 文件已不存在,但是有个test_app#P***.ibd分区表文件存在。手工删除该 ibd 文件。


4.7>修改数据库配置文件 my.cnf 文件的参数为“innodb_file_per_table=ON”;启动数据库。


4.8> 重新执行 test_app 表的建表 SQL 语句。即可成功创建表。

五、问题处理(方法二,客户执行步骤):

5.1> 设置 innodb_file_per_table=OFF:set global innodb_file_per_table='OFF';


5.2> 执行 test_app 表的建表语句,建表成功。


5.3> 删除 test_app 表drop table test_app;


5.4> 重启数据库。


5.5> 再执行 test_app 表的建表语句,建表成功。


发布于: 刚刚阅读数: 5
用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
GreatSQL数据库DROP表后无法重建_GreatSQL_InfoQ写作社区