更新时间:2024-06-20 GMT+08:00
删除表数据后执行了VACUUM,但存储空间并没有释放
问题现象
删除表数据后执行了VACUUM,但是存储空间并没有释放。
原因分析
- 执行VACUUM时,对某些表可能没有权限,或者数据库本身并没有太多的数据膨胀。
- 执行VACUUM,默认清理当前用户在数据库中拥有权限的每一个表,没有权限的表则直接跳过回收操作。
- 参数vacuum_defer_cleanup_age不是0,该参数在老版本默认为8000,表示最近8000个事务产生的脏数据不进行回收。
- 为了保证事务可见性,产生脏数据的事务号,如果大于当前活跃的老事务号,则这部分脏数据也不会清理。
处理方法
- 建议对单个表执行VACUUM FULL命令,命令格式为“VACUUM FULL 表名”。
- 如果您对表没有权限,请联系数据库管理员或表的所有者进行处理。
- 对于vacuum_defer_cleanup_age不是0的场景,可以将此参数改为0,取消VACUUM的事务延迟。
- 对于存在老事务的场景,重启集群再重新执行VACUUM FULL可以保证空间一定回收,否则只能等老事务结束再执行VACUUM FULL。
父主题: 集群性能