更新时间:2024-01-25 GMT+08:00
Delete表数据后执行了VACUUM,但是空间并没有释放
问题现象
Delete表数据后执行了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。
父主题: 集群性能