今天开发人员求助,说是一台开发环境 PostgreSQL 库使用客户端连接不上, 在要得数据库主机 root 密码后,上去瞧瞧,问题还真奇怪。
查看主机进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14
[root@localhost ~] # ps -ef | grep post postgre 4641 27639 0 2010 ? 00 :00 :00 postgres : community community 127 .0 .0 .1 (57739 ) idle postgre 8300 27639 0 Jan12 ? 00 :00 :00 postgres : gamehall gamehall 127 .0 .0 .1 (40177 ) idle in transaction postgre 8302 27639 0 Jan12 ? 00 :00 :00 postgres : gamehall gamehall 127 .0 .0 .1 (40179 ) idle in transaction postgre 8303 27639 0 Jan12 ? 00 :00 :00 postgres : gamehall gamehall 127 .0 .0 .1 (40180 ) idle in transaction postgre 8304 27639 0 Jan12 ? 00 :00 :00 postgres : gamehall gamehall 127 .0 .0 .1 (40181 ) idle in transaction root 17571 17467 0 10 :07 pts /2 00 :00 :00 su - postgre postgre 17572 17571 0 10 :07 pts /2 00 :00 :00 -bash root 21591 21557 0 14 :42 pts /5 00 :00 :00 grep post postgre 24561 27639 0 Mar24 ? 00 :00 :00 postgres : gamehall gamehall 127 .0 .0 .1 (41383 ) idle postgre 27639 1 0 2010 ? 00 :03 :32 /opt /postgresql-9 .0 .1 /bin /postgres -D /opt /postgresql-9 .0 .1 /data postgre 27641 27639 0 2010 ? 00 :00 :00 postgres : writer process postgre 27644 27639 0 2010 ? 00 :06 :12 postgres : stats collector process [root@localhost ~] # su - postgres
备注:从上面可以看出,PostgreSQL 进程还在。
2 连接数据库报错
1 2 3 4 5 6 7
[postgre@localhost data]$ psql -h 127.0.0.1 psql: could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432? [postgre@localhost data]$ psql -p 1921 psql: FATAL: the database system is shutting down
备注:数据库连接不上,报 “the database system is shutting down” , 意思是数据库正在关闭, 而 PostgreSQL 进程明明都还在,再仔细观察了上面步骤的进程,发现有十几个“ 127.0.0.1(40181) idle in transaction” 难道是这些进程发生了异常,遗憾的是数据库日志参数没打开,无法查看日志。
正在分析的时候,开发人员告诉了个信息,说是这台机器在前段时间可能是断电了。汗,断电了?先不管什么原因,努力先把库恢复正常在说。
关闭数据库
1 2 3
[postgre@localhost data]$ pg_ctl stop -m fast pg_ctl: PID file "/opt/postgresql-9.0.1/data/postmaster.pid" does not exist Is server running?
备注:数据库无法关闭, 文件 postmaster.pid 不存在。
创建 postmaster.pid 文件
参照其它库的 postmaster,pid 文件,构造了一个,创建文件 /opt/postgresql-9.0.1/data/postmaster.pid
, 并增加以下内容:
1 2
27639 /opt/postgresql-9.0 .1 /data
备注: 第一行: “27639” 表示 PostgreSQL 的父进程,根据步骤一的红色标识可以看到; 第二行: “/opt/postgresql-9.0.1/data” 表示数据目录; 第三行:正常情况下,第三行还有两个字段,但具体信息不详,无法构造。
再次尝试关闭数据库
再次尝试停数据库,数据库可以正常关闭
1 2 3
[postgre@localhost data]$ pg_ctl stop -m fast -D $PGDATA waiting for server to shut down.. .. done server stopped
启动数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[postgre@localhost data]$ pg_ctl start -D $PGDATA server starting [postgre@localhost data]$ ps -ef | grep post root 17571 17467 0 10:07 pts/2 00:00:00 su - postgre postgre 17572 17571 0 10:07 pts/2 00:00:00 -bash root 21595 21557 0 14:42 pts/5 00:00:00 su - postgre postgre 21596 21595 0 14:42 pts/5 00:00:00 -bash postgre 21933 1 6 14:54 pts/5 00:00:00 /opt/postgresql-9.0.1/bin/postgres -D /opt/postgresql-9.0.1/data postgre 21934 21933 0 14:54 ? 00:00:00 postgres: logger process postgre 21936 21933 0 14:54 ? 00:00:00 postgres: writer process postgre 21937 21933 0 14:54 ? 00:00:00 postgres: wal writer process postgre 21938 21933 0 14:54 ? 00:00:00 postgres: autovacuum launcher process postgre 21939 21933 0 14:54 ? 00:00:00 postgres: stats collector process postgre 21941 21596 0 14:54 pts/5 00:00:00 ps -ef postgre 21942 21596 0 14:54 pts/5 00:00:00 grep post
备注:数据库正常启动, 到这里数据库终于恢复正常了!
总结
至今 postmaster.pid 文件丢失原因尚不明确,但这次通过构造 postmaster.pid 文件从而将数据库成功恢复!
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/236403.html