快过年了,今天对数据库进行健康检查,发现海外一数据库中出现大量以下日志,而且已经报了十几天,CSV 日志如下:
数据库 CSV 日志
1 |
2012-01-18 15:22:39.098 CST,,,8871,,4f16733e.22a7,1,,2012-01-18 15:22:38 CST,81/42114625,0,WARNING,01000,"oldest xmin is far in the past",,"Close open transactions soon to avoid wraparound problems.",,,,,, |
备注:根据提示信息, 猜测有尚未提交的事务,导致 autovacuum 进程不能 vacuum。
查询数据库对像年龄
1 |
postgres=# select age(relfrozenxid) from pg_class where relkind='r' order by 1 desc limit 10; |
备注:数据库对像年龄已经达到 3 亿。
发现异常进程
1 |
postgres=# select procpid, datname,usename,query_start from pg_stat_activity where current_query !='<IDLE>' |
备注:上面发现进程 27694 是去年的,至今仍未提交,经和应用人员确认后,可以 kill。
Kill 进程 27694
1 |
postgres=# select pg_terminate_backend(27694); |
发现 Autovacuum 进程
1 |
[postgres@skytf-db](mailto:postgres@skytf-db)-> ps -ef | grep auto |
进程 kill 后再次查看年龄
1 |
postgres=# select age(relfrozenxid) from pg_class where relkind='r' order by 1 desc limit 10; |
备注:进程 kill 后再次查看年龄,数据库对像年龄已经循环,当前最大值为 50003395,并且日志也不再报错。
参考
http://www.postgresql.org/docs/9.0/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/237819.html