使用OPTIMIZE TABLE命令释放MySQL实例的表空间

更新时间:2025-03-05 01:47:06

使用 DELETE 语句删除数据时,数据库仅将记录或数据页标记为可复用,而不会直接减少磁盘文件的大小,即表空间不会自动回收。若需释放表空间,可通过执行 OPTIMIZE TABLE 语句来实现。

前提条件

  • InnoDBMyISAM引擎支持OPTIMIZE TABLE语句。

  • 实例剩余磁盘空间需要大于等于需释放表的空间。当实例剩余磁盘空间不足时,建议先扩容磁盘空间,如何扩容请参见变更配置

    说明

    执行OPTIMIZE TABLE语句时,表数据会复制到新建的临时表中,增加实例的磁盘使用率。

注意事项

  • 如果未使用DELETE语句删除大量数据,直接执行OPTIMIZE TABLE语句将无法有效降低表空间使用率。因此,需要先通过DELETE语句删除数据,再执行OPTIMIZE TABLE以释放表空间。

    说明

    如果实例剩余磁盘空间不足,且未进行大量删除表的操作,可以参见以下文档扩容磁盘存储空间:

  • RDS MySQL 5.78.0 中,OPTIMIZE TABLE采用Online DDL方式执行,支持并发DML操作。但对大表执行该操作可能引发突发的IOBuffer资源占用,存在锁表或资源抢占风险,业务高峰期可能导致实例不可用或监控中断。因此,建议在业务低峰期执行此操作以避免影响正常业务。

通过命令行操作

  1. 连接MySQL数据库,详情请参见通过命令行、客户端连接RDS MySQL实例

  2. 执行以下SQL语句,释放表空间。

    OPTIMIZE TABLE [$Database1].[Table1],[$Database2].[Table2]
    说明
    • [$Database1]与[$Database2]为数据库名,[Table1]与[Table2]为表名。

    • InnoDB引擎中执行OPTIMIZE TABLE语句时,会出现以下提示信息,该信息是正常执行返回的结果,您可忽略信息,确认返回“ok”即可。详情请参见OPTIMIZE TABLE Statement

      Table does not support optimize, doing recreate + analyze instead

通过DMS操作

  1. 登录MySQL数据库,详情请参见通过DMS登录RDS数据库

  2. 在左侧选择目标实例的实例ID,然后双击目标库,右键单击任意表名,然后选择批量操作表

  3. 勾选需要释放空间的表名,然后选择表维护 > 优化表优化表

  4. 在弹出的对话框中确认变更信息正确,然后单击确认即可。

  • 本页导读 (1)
  • 前提条件
  • 注意事项
  • 通过命令行操作
  • 通过DMS操作