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

概述

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

详细信息

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

MySQL可以通过optimize table语句释放表空间,重组表数据和索引的物理页,减少表所占空间和优化读写性能。但是执行optimize table语句过程时,数据会复制到新建的临时表中,会增加实例的磁盘使用率。当实例剩余磁盘不足以容纳临时表时,建议先扩容磁盘空间,如何扩容请参见变更配置

说明

  • 如果您没有使用delete语句进行大量删除表数据的操作,使用optimize table语句也无法降低表空间的使用率。
  • optimize table语句会导致锁表,建议在业务低峰期操作。
  • 仅Innodb和MyISAM引擎支持optimize table语句。

通过命令行操作

  1. 连接MySQL数据库,详情请参见连接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登录MySQL数据库
  2. 在左侧选择目标实例的实例ID,然后双击目标库,右键单击任意表名,然后选择批量操作表
  3. 勾选需要释放空间的表名,然后依次选择表维护>优化表
  4. 在弹出的对话框中确认变更信息正确,然后单击确认即可。

更多信息

如果您不是因为进行大量删除表的操作导致表空间使用率增大,可以参见以下文档进行处理:

适用于

  • 云数据库RDS MySQL版