3

我正在尝试运行此查询:

alter table about_member discard tablespace;

但是当我这样做时,我的错误日志正在输出:

InnoDB:错误:表`diskise`.`about_member`
InnoDB:在系统表空间0中,不能被丢弃

我该怎么做才能丢弃这个表空间,以便导入我拥有的备份?

4

2 回答 2

1

请参阅此手册页

默认情况下,所有 InnoDB 表和索引都存储在系统表空间中。作为替代方案,您可以将每个 InnoDB 表及其索引存储在其自己的文件中。此功能称为“多表空间”,因为此设置生效时创建的每个表都有自己的表空间。

Per-Table 表空间的优点

您可以在截断或删除表时回收磁盘空间。对于在每表文件模式关闭时创建的表,截断或删除它们会在 ibdata 文件内部创建可用空间。该可用空间只能用于新的 InnoDB 数据。

听起来您在默认表空间中创建了表,因此您不能丢弃该表空间。也就是说,您应该能够在不首先丢弃表空间的情况下导入数据,除非您的磁盘空间不足。

于 2013-11-26T04:53:15.543 回答
0

我在尝试从.ibd文件中恢复一个表时遇到了同样的问题。我知道这已经很长时间了,所以我在这里为仍然遇到同样问题的人写了这篇文章。

继续@Ed Cottrell 的回答,您将需要更改 mysql 全局变量innodb_file_per_table以让 mysql 存储.ibd在您自己的文件中,而不是使用system tablespace

为此,您可以执行以下操作(另请参阅官方文档):

  • 更改您的 my.cnf 文件,添加以下行并重新启动 mysql 服务器

    [mysqld]
    innodb_file_per_table=1
    
  • 在 mysql 命令中设置全局变量(有时由于安全问题而无法工作)

    SET GLOBAL innodb_file_per_table=1;
    

在此生效之前,您可能需要 DROP 您的表。完成此操作后,您将能够看到目录中的.ibd文件PATH/TO/MYSQL/DB_NAME(例如/var/lib/mysql/DB_NAME)。

于 2016-07-05T07:45:43.170 回答