数据库无法连接 psql FATAL: the database system is shutting down

今天开发人员求助,说是一台开发环境 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

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论