任何数据库都存在表膨胀的风险,数据库设计时,应该识别出会频繁更新(包括新增、删除、更新记录)的表。对表、表空间做出可能达到的最大值的预判。
数据库空闲空间管理,PostgreSQL 8.3及之前前采用的是单一文件管理数据文件空闲空间的方式,PostgreSQL 8.4修改为了对每个数据文件都创建一个空闲空间管理文件来管理空闲空间,但是索引空闲空间由于其特殊性仍旧无法合理管理。并且作为数据库管理员,不应该强依赖于数据库对空闲空间的管理。应该增加定时检查,粒度可以到表空间,也可以到表,当表空间、表超过我们的预期时能够上报告警或者自动触发回收。如果触发回收机制后仍旧超过阈值,则一定要上报告警。防止问题累计直至达到了磁盘空间上限或者表空间上限而导致业务失败。
对于PostgreSQL而言,提供了autovacuum机制来定时扫描处理空闲空间,要合理的设置autovacuum的相关参数,使得其空闲空间管理机制能够正常运行。PostgreSQL强行回收空间有如下方法:
1.对于表,可以使用vacuum full方法,但是这个会拿表级锁,阻塞查询、更新等所有操作。
2.对于索引,可以采用下面三种方法之一
1)cluster
2)reindex
3)create new index,drop index,rename index 优点:拿锁时间短,对业务影响小。
或者引入pg_reorg插件,该插件可以对有唯一索引的表回收,基本原理是创建一个和原表一模一样的新表,然后迁移数据。优点是拿锁时间很短,对业务营销较小。
autovacuum使用要注意如下:
1. autovacuum只会回收文件最后的那部分空间。记录所在文件位置可以通过查询记录的ctid确认。
2.autovacuum处理所有表使用的数据用户为initdb指定的那个用户(默认的用户名称与安装数据库的操作系统用户名相同)