删除 table 后如何在 InnoDB 中回收磁盘 space

How to reclaim disk space in InnoDB after dropping table

我在mysql有一个大InnoDBtable。问题是我的磁盘 space 快满了。我想减少我的磁盘 space。如果我要从 table 中删除一些行并使用此命令:

optimize TABLE_NAME

那么我的磁盘space就会减少。但是我想删除 table。如果我将 table 删除,则没有任何 table 可以优化它!删除 InnoDB table 后减少磁盘 space 的适当命令是什么?

实际上要在 MySQL 中删除表后回收 space,您应该在 MySQL 中启用 Per-Table File配置。在这里阅读更多内容:

https://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-tablespaces.html

drop 命令将自动释放磁盘 space。

注意:假设您正在使用 innodb_file_per_table,因为您可以通过优化 table 语法释放 space。

您可以尝试将您的服务器配置为使用 innodb_file_per_table,但请确保您有备份,然后删除并恢复它。您可以 运行 optimize table.

您可以运行检查innodb_file_per_table是否开启

mysql> show variables like "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

OPTIMIZE TABLE 复制 table。更具体地说,它确实

  1. 像现有的那样创建一个新的 table 架构。
  2. 将行复制到新的 table。
  3. 重命名以交换 tables.
  4. 放弃旧的 table。

请特别注意,在短时间内您将有两个 table 副本占用磁盘上的 space。

  • 如果磁盘空间太紧 space,这将失败。
  • 如果您有 innodb_file_per_table = OFFibdata 文件可能会扩展,但不会缩小。同样,这可能会导致失败。

从 5.6.17 开始,OPTIMIZE TABLE 将原地执行工作。但是,您必须删除并重新添加任何 FULLTEXT 个索引。

DROP TABLE 以下列方式之一工作:

  • innodb_file_per_table = OFF:在 ibdata 中释放 space。但是这个space并没有发布到OS。相反,它将被重新用于插入等任何 table.
  • innodb_file_per_table = ON:table获取的文件及时发布到OS.

但是...当我提到innodb_file_per_table的设置时,我指的是table是CREATEd或最后一个ALTERed时的设置,不是当前设置。