昨天开发人员跑来,说是他的测试环境数据库无法连接,下面是详细过程。
故障现象
登陆到数据库主机,执行 psql
1 |
[postgresql@test_db ~]$ psql |
果然,连 psql 命令都不能执行,根据报错信息,知道数据库在做恢复。
排查过程
查看 PostgreSQL 后台进程
1 |
[postgresql@test_db ~]$ ps -ef | grep post |
备注:从上面输出,可以看到一个关键信息 “ recovering 00000001000001CA0000001F “ , 这说明数据库在做恢复,于是向开发人员了解一下情况,原来他正在执行一个 copy 操作,觉得太慢,后来在操作系统层面将 copy 进程 kill 了。原来如此。这就是PG 在做恢复的根本原因, 俺再一次和开发人员强调,PG的进程不能通过 kill 来杀。。。
试图关闭数据库
1 |
[postgresql@test_db ~]$ pg_ctl stop -m fast |
很不幸,数据库无法正常关闭。
查看PostgreSQL 后台进程
1 |
[postgresql@test_db ~]$ ps -ef | grep post |
数据库还是老样子,不能连接。
查看 Csvlog
1 |
2011-05-23 17:48:53.006 CST,"mylog","skytflog",1457,"192.168.171.39:55019",4dda2d85.5b1,1,"",2011-05-23 17:48:53 CST,,0,FATAL,57P03,"the database system is shutting down",,,,,,,,,"" |
备注:CSV日志里有大量the database system is shutting down
,意思是 PostgreSQL 正在关闭,俺在想,是否应该先等等,或者数据库就关闭了。
查看数据库 WAL
1 |
[postgresql@test_db pg_xlog]$ ls -lrt |
备注:注意近一个文件是 “00000001000001CA0000001F” , 再根据 “ postgres: startup process recovering 00000001000001CA0000001F “ 说明,PG已经恢复到最后一个日志文件了,猜测再等等,应该就恢复完成。大概过了10分钟左右, 后来发现PostgreSQL 果然停了,正好应验了前面的猜测,有点险。接着,启动数据库。
启动数据库
1 |
[postgresql@test_db pg_log]$ pg_ctl start -D $PGDATA |
运气不错,数据库可以正常启动。
连接测试
1 |
[postgresql grep post pg_log]$ ps -ef | |
汗,总算缓了口气,数据库正常启动,数据还在,再一次向开发人员强调,以后不要通过”kill “ 命令来杀 PostgreSQL 进程。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/236399.html