MySQL5.7无法重建(含大量)分区表

文章讲述了在MySQL5.7数据库中,由于DDL操作非原子性,用户尝试删除大量分区表test_app后遇到问题,表虽看似删除但文件残留导致无法重建。提供了两种处理方法:一是先在临时库创建表并复制frm文件,然后切换到ON模式重建;二是全局设置innodb_file_per_table为OFF,直接重建并恢复到ON模式。
摘要由CSDN通过智能技术生成

MySQL5.7数据库

DROP含有大量分区表的大表后导致无法重建该分区表

一、数据库信息:

数据库版本:5.7.21-log

APP业务库内有一个含有大量(几百个)分区表的大表test_app。

二、问题描述:

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

三、问题分析:

3.1> 原因是MySQL 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”错。

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

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表的建表语句,建表成功。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值