使用“optimize table”命令释放MySQL实例的表空间

使用delete语句删除数据时,delete语句只是将记录的位置或数据页标记为了“可复用”,但是磁盘文件的大小不会改变,即表空间不会直接回收。此时您可以通过optimize table语句释放表空间。

前提条件

  • 仅InnoDB和MyISAM引擎支持optimize table语句。
  • 实例剩余磁盘空间需要大于等于需释放表的空间。当实例剩余磁盘空间不足时,建议先扩容磁盘空间,如何扩容请参见变更配置
    说明 执行optimize table语句时,表数据会复制到新建的临时表中,增加实例的磁盘使用率。

注意事项

  • 如果您没有使用delete语句删除大量表数据,使用optimize table语句也无法降低表空间的使用率。
    说明 如果实例剩余磁盘空间不足,且未进行大量删除表的操作,可以参见以下文档扩容磁盘存储空间:
  • optimize table语句在RDS MySQL 5.7、RDS MySQL 8.0上采用Online DDL方式执行,允许并发执行DML。对大表进行optimize table操作会带来突发的IO和Buffer使用量,可能导致锁表和抢占资源,业务高峰期可能会导致实例不可用以及监控断点。建议在业务低峰期操作。

通过命令行操作

  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. 在弹出的对话框中确认变更信息正确,然后单击确认即可。