文档

使用OPTIMIZE TABLE命令或DMS工具回收表空间

更新时间:

使用DELETE语句删除数据时,只是将记录的位置或者数据页标记为可复用,但是存储空间中文件的大小不会改变,即表空间不会直接被回收。此时,您可以通过执行OPTIMIZE TABLE命令或DMS工具来回收表空间。

使用DMS工具或OPTIMIZE TABLE命令均可以回收表空间,两种方式的各自特点如下表所示。通常情况下,在业务低峰期且希望执行效率高时,可以优先选择使用OPTIMIZE TABLE命令来回收表空间。若您希望尽可能地降低对集群负载的影响且对执行效率不敏感时,可以优先选择使用DMS工具来回收表空间。

回收表空间的方式

对比项

是否允许并发读写

执行速度

是否支持限流

通过OPTIMIZE TABLE命令回收表空间

通过DMS回收表空间

说明

如需了解更多关于回收表空间的内容,请搜索钉钉群号加群进行咨询。钉钉群号:15375044501。

前提条件

集群的数据库引擎为InnoDB,且表中不包含全文索引。

注意事项

  • 当目标表的碎片率较低时,执行OPTIMIZE TABLE命令不能显著降低表空间大小。您可以通过information_schema.tables中的DATA_FREE字段来查看目标表的碎片率。

  • 执行OPTIMIZE TABLE语句时,表数据会复制到新建的临时表中,会临时增加集群的存储空间使用率。

  • 对于不包含全文索引的表,OPTIMIZE TABLE语句使用Online DDL方式执行,允许并发读写。

  • 对大表执行OPTIMIZE TABLE操作会带来突发的IO和Buffer使用量,可能会导致锁表和抢占资源,在业务高峰期执行该操作可能会导致集群不可用以及监控断点。建议在业务低峰期执行该操作。

操作步骤

通过OPTIMIZE TABLE命令回收表空间

  1. 连接数据库集群

  2. 执行以下命令,回收表空间。

    OPTIMIZE TABLE [$Database1].[Table1],[$Database2].[Table2]

    其中,[$Database1]和[$Database2]为数据库名称,[Table1]和[Table2]为表名。

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

    Table does not support optimize, doing recreate + analyze instead

通过DMS回收表空间

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 单击页面右上角的登录数据库

  5. 在左侧选择目标集群ID,双击目标库,右键单击任意表名,然后选择批量操作表

    image.png

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

    image.png

  7. 在弹出的优化表对话框中,确认优化信息无误后,单击确认