【发布时间】:2013-11-26 04:25:07
【问题描述】:
我正在尝试运行此查询:
alter table about_member discard tablespace;
但是当我这样做时,我的错误日志正在输出:
InnoDB:错误:表 `diskise`.`about_member`
InnoDB:在系统表空间 0 中,不能丢弃
我该怎么做才能丢弃这个表空间,以便导入我拥有的备份?
【问题讨论】:
标签: mysql tablespace
我正在尝试运行此查询:
alter table about_member discard tablespace;
但是当我这样做时,我的错误日志正在输出:
InnoDB:错误:表 `diskise`.`about_member`
InnoDB:在系统表空间 0 中,不能丢弃
我该怎么做才能丢弃这个表空间,以便导入我拥有的备份?
【问题讨论】:
标签: mysql tablespace
默认情况下,所有 InnoDB 表和索引都存储在系统表空间中。作为替代方案,您可以将每个 InnoDB 表及其索引存储在其自己的文件中。此功能称为“多表空间”,因为此设置生效时创建的每个表都有自己的表空间。
Per-Table 表空间的优点
您可以在截断或删除表时回收磁盘空间。对于关闭每表文件模式时创建的表,截断或删除它们会在 ibdata 文件内部创建可用空间。该可用空间只能用于新的 InnoDB 数据。
听起来您在默认表空间中创建了表,因此您不能丢弃该表空间。也就是说,您应该能够在不首先丢弃表空间的情况下导入数据,除非您的磁盘空间不足。
【讨论】:
alter table about_member import tablespace;,我得到了同样的错误,除了最后一个词是imported而不是discarded
tablespace 仍然指的是系统表空间。现有表中是否有需要保留的数据?如果没有,为什么不删除或截断现有表,然后导入新数据?
我在尝试从.ibd 文件恢复一张表时遇到了同样的问题。我知道这已经很长时间了,所以我在这里为仍然遇到同样问题的人写了这篇文章。
继续@Ed Cottrell 的回答,您需要更改mysql 全局变量innodb_file_per_table 以让mysql 将.ibd 存储在您的自己的文件 中,而不是使用系统表空间。
要实现这一点,您可以这样做(另请参阅official docs):
更改您的 my.cnf 文件,添加以下行并重新启动 mysql 服务器
[mysqld]
innodb_file_per_table=1
在 mysql 命令中设置全局变量(有时由于安全问题无法正常工作)
SET GLOBAL innodb_file_per_table=1;
您可能需要 DROP 您的表才能生效。
完成此操作后,您将能够在PATH/TO/MYSQL/DB_NAME 目录中看到.ibd 文件(例如/var/lib/mysql/DB_NAME)。
【讨论】: