大IO的PostgreSQL手动vacuumdb和自动vacuum对比

标签:
dbpostgresqlit数据库 |
我管理的数据库PostgreSQL是版本9.3,其实PSQL早就在8.3就已经配置了auto-vacuum的功能,但是由于我们数据库的IO每天会比较大,而且数据库保存的数据时间比较长而且有8T的数据存量,以至于auto-vacuum不能够清理掉太多旧的XID,导致我们的数据库在几个月前出现了transactionID
wrap around 的情况,不得不停掉数据库进行full
vacuum(用了大概九天才成功清理,还好少于100W条,要不然真的恢复不了了,当时很多用户都快疯掉了,幸好还有一台备用数据库临时救火).
因为我们的数据库每天的IO很大,而且存储的数据很多,从那次事故以后我就不相信数据库自带的auto-vacuum功能了,所以我要手动或者写脚本来自动执行vacuum。
1. 在执行vacuumdb之前,已经到了很大的值了:
然后我开了一个后台的screen,每个DB都单独进行了vacuumdb的命令:
vacuumdb -d mydb -z -v
.
在这里我没有用-f,因为担心执行时间过长(上次是9天),而且对于最大的数据库ispdb_stmsg,我提前用脚本先vacuum了很多看起来很大表(大于2G),脚本是用perl写的,在这就列出来了,因为case-by-case。
2. 三天之后的结果:
template0没有减少,反而一直在增加,这个在后面的博客里会详细介绍。
开一个screen的job对所有的数据库进行full vacuum
: vacuumdb -a
-f -z -v
.
命令还在后台执行,但是很快见到效果,最大的数据库ispdb_stmsg的XID
age由852136697变成了162599238,如果执行结束的话应该会变化更大。
http://s7/mw690/002InA8tgy6U2qVzeK216&690
4. 后面我会在crontab中加入一个自动执行的full vacuum, 因为数据库较大决定每个月对最大的数据库idpsb_stmsg执行一次全面的vacuum:
4. 后面我会在crontab中加入一个自动执行的full vacuum, 因为数据库较大决定每个月对最大的数据库idpsb_stmsg执行一次全面的vacuum:
02 2 25 */1 * postgres vacuumdb -d ispdb_stmsg -f -z -v
>> /tmp/vacuumdb.log