加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2015-07-22 17:28:33)
标签:

db

postgresql

it

数据库

我管理的数据库PostgreSQL是版本9.3,其实PSQL早就在8.3就已经配置了auto-vacuum的功能,但是由于我们数据库的IO每天会比较大,而且数据库保存的数据时间比较长而且有8T的数据存量,以至于auto-vacuum不能够清理掉太多旧的XID,导致我们的数据库在几个月前出现了transactionID wrap around 的情况,不得不停掉数据库进行full vacuum(用了大概九天才成功清理,还好少于100W条,要不然真的恢复不了了,当时很多用户都快疯掉了,幸好还有一台备用数据库临时救火).

因为我们的数据库每天的IO很大,而且存储的数据很多,从那次事故以后我就不相信数据库自带的auto-vacuum功能了,所以我要手动或者写脚本来自动执行vacuum。

前几天天在screen里面开了一个手动vacuumdb的命令,效果很明显。 
1. 在执行vacuumdb之前,已经到了很大的值了:
然后我开了一个后台的screen,每个DB都单独进行了vacuumdb的命令:
vacuumdb -d mydb -z -v . 
在这里我没有用-f,因为担心执行时间过长(上次是9天),而且对于最大的数据库ispdb_stmsg,我提前用脚本先vacuum了很多看起来很大表(大于2G),脚本是用perl写的,在这就列出来了,因为case-by-case。

2. 三天之后的结果:
template0没有减少,反而一直在增加,这个在后面的博客里会详细介绍。
http://s1/mw690/002InA8tgy6U2qHUOm450&690

3. 然后我就可以执行full vacuum了:
开一个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:
02 2 25 */1 * postgres vacuumdb -d ispdb_stmsg -f -z -v >> /tmp/vacuumdb.log 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有