Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56684
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-01 13:27
个人简介

学习是一种信仰

文章分类

全部博文(18)

文章存档

2016年(8)

2015年(8)

2013年(2)

我的朋友

分类: Mysql/postgreSQL

2016-03-24 23:32:40

今天在查询greenplum的时候,突然打出了一个报警:
WARNING: database "youdb" must be vacuumed within 1486003143 transactions (seg14 segdb4:60002 pid=26559)
HINT: To avoid a database shutdown, execute a full-database VACUUM in "youdb".

       随后我试着执行一些基本命令,都会依然报这个告警,按着提示,我对greenplum做了一个vacuum full操作,在执行此命令的过程中,依然会报这个告警,直到结束,依然报警,随后我重启了greenplum,做vacuum,做vacuum freeze,都不行,后来上网上找了一些相关文档,以单用户的模式登陆greenplum,发现一些基本命令不能使用,原因是greenplum虽然是基于postgresql 8.2.5的,但是缺少一些lib包,反复折腾了一天,能操作的都做了,依然没有解决,没办法只能用大招了--找德哥,在德哥的远程协助下,知道了问题的所在。
      原来这算是greenplum的一个小bug,这个greenplum使用也有两年的时间了,在这期间也发生过segment节点当掉的情况,一般的解决方法就是gprecoverseg,然后重启greenplum,虽然能继续提供使用了,但是有一个隐含的雷就埋下了,因为我的greenplum是挂载pgq同步数据的,当segment失败并恢复后,pgq本身的一些临时表却不会被数据库自动删除,而是留在了原地,并且触发了数据库本身的一个叫年轮的机制,随着临时表积压的越来越多,年轮越来越大,到达了greenplum的报警阀值,所以会出现这个告警,虽然只是一个告警,但是如果长期不处理,那么最后的结果就是数据库宕机不可用。 既然是greenplum的一个小小bug,那么用他提示的解决方法execute a full-database VACUUM就肯定不能解决了,那怎么办,暴力破解呗!!!
      首先需要确定数据库没有事务连接,看一下你这个实例下所有数据库的年轮值
      select datname,age(datfrozenxid) from pg_database;

      然后看一下数据库设置的阀值是多少
      select setting from pg_settings where name ='vacuum_freeze_min_age';

     接下来要做的是查看是不是有临时文件,以及临时文件的年轮值:
     select relname,age(relfrozenxid) from pg_class where relkind='r' order by 2 desc;

找到了这些年轮值非常大的临时文件,接下来要做的肯定就是把它除掉了,想除掉它用普通的删除命令可不行,毕竟它在数据库中待这么久了,也是有脾气的,脾气大怎么办?脾气大也得治啊!以UTIL的方式登录到greenplum的master及各个segment实例:PGOPTIONS="-c gp_session_role=utility" psql -h xx -p xx -U xx -d xx;然后再把所有查到的临时文件统统删掉,这样就OK了,删掉文件之后,还得做一步vacuum freeze才算是完美。这样再次在数据库中执行任何常规命令,都不会在出现warning报警了。




阅读(4335) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~