【问题标题】:table is in the system tablespace 0 which cannot be discarded表在系统表空间 0 中,不能丢弃
【发布时间】:2013-11-26 04:25:07
【问题描述】:

我正在尝试运行此查询:

alter table about_member discard tablespace;

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

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

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

【问题讨论】:

    标签: mysql tablespace


    【解决方案1】:

    this manual page:

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

    Per-Table 表空间的优点

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

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

    【讨论】:

    • 我也运行了alter table about_member import tablespace;,我得到了同样的错误,除了最后一个词是imported而不是discarded
    • 对;该命令中的tablespace 仍然指的是系统表空间。现有表中是否有需要保留的数据?如果没有,为什么不删除或截断现有表,然后导入新数据?
    • 好的,如何从 ibd 文件中导入它?
    【解决方案2】:

    我在尝试从.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)。

    【讨论】:

    • 当没有其他解决方案有效时,即使在 6 年后仍然有效。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2015-01-04
    相关资源
    最近更新 更多