当数据库的磁盘满了,需要drop一些比较大的表,但是DROP TABLE
不管用,因为数据库不能写入。
背景
Database: my_db
Table name: my_tbl
Table size: 300GB+
保存了show create table my_tbl
的结果
删除了对应的my_tbl.ibd
,my_tbl.frm
文件
删除之后,想重新把table建上,可能会遇见以下错误
ERROR 1813 (HY000): Tablespace '`XXX`.`XXXXXX`' exists.
尝试
ALTER TABLESPACE [tablespace_name] DROP DATAFILE [file_name]
:不管用。
解决方法:
- 创建一个新数据库
my_db_2
,一定是要在同一个MySQL的server上。 - 在新db中,运行保存下来的create table语句,此方法可以在当前数据库文件里生成两个对应的文件
my_tbl.ibd
,my_tbl.frm
- 把
my_tbl.frm
文件拷贝到旧的数据库(my_db
)目录下 chown mysql:mysql my_tbl.frm
- 在旧db(
my_db
)中,运行DROP TABLE my_tbl
,此时就能把表删除,然后再用保存的语句创建同样的表。
Reference:
https://stackoverflow.com/a/12086798/5755004
InnoDB: You can drop the orphaned table inside InnoDB by
InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and copying the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.