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

本文将介绍如何回收表空间。

前提条件

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

注意事项

重要

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

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

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

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

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

使用DMS工具或OPTIMIZE TABLE命令均可以回收表空间,两种方式各自的特点如下表所示。

  • 业务低峰期且希望执行效率高时

    • 优先选择:使用OPTIMIZE TABLE命令来回收表空间。

    • 适用场景:在业务负载较轻、对执行效率要求较高的情况下,OPTIMIZE TABLE可以快速回收表空间,降低集群的空间使用开销。

  • 希望尽可能降低对集群负载的影响且对执行效率不敏感时

    • 优先选择:使用DMS(Database Management System)工具来回收表空间。

    • 适用场景:在对集群负载敏感、对执行效率不敏感的情况下,DMS工具能够以对业务影响较低的方式对表空间进行回收,降低空间回收操作对集群性能的影响。

回收表空间的方式

对比项

是否允许并发读写

执行速度

是否支持限流

通过OPTIMIZE TABLE命令回收表空间

通过DMS回收表空间

说明

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

操作步骤

通过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控制台,选择集群所在地域,在集群列表中单击目标集群ID进入详情页。

  2. 单击页面右上角的登录数据库

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

    image.png

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

    image.png

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