PG数据库导致断电/重启无法正常启动问题排查

PG数据库导致断电/重启无法正常启动问题排查

一、问题

数据库断电后,启动PG数据库后无法正常启动,报”psql: could not connect to server: No such file or directory”的错误,错误图片如下:

 

 

二、背景分析

数据库是单机版,使用k8s进行部署运行在指定节点,数据目录挂服务器的指定目录。在数据中心机房部署了两套k8s集群,但是pod网络未规划好,两个集群pod网段有重复导致两个集群之间的pod概率性的发生地址冲突。在发生ip重复了后修改了我方使用的k8s集群的pod网段,并对所有pod进行了重启,在执行重启操作后我方部署pg数据库无法正常提供服务,经过查询容器日志发现了上述问题。

三、解决过程

①   根据日志进入容器查看文件是否存在

kubectl exec -it -n namespace contairnerId /bin/sh

进入容器后发现/var/run/postgresql/.s.PGSQL.5432文件不存在,然后进入一个正常的pg数据库容器,发现该文件是存在的,因此确认pg数据库的进程不正常。

②   查看pg数据库进程是否存在

cat /var/lib/postgresql/11/main/master.pid

                   查看后结果和含义如下:

 

  

          1)154->数据库的主进程号,可以通过ps -ef | grep postgres来查询,同时与/var/run/postgresql/11-main.pid里的值一致。

     2)/var/lib/postgresql/11/main->数据库的数据目录

     3)1724468744->数据库的启动时间,需要进行转换

          4)5432->数据库端口号

     5)/var/run/postgresql->PostgreSQL 的 Unix 域套接字目录

         然后通过执行top命令,发现pg数据库的进程并未启动,因此进一步确认pg数据库未正常启动。

③   重新启动pg数据库进程,发现问题原因

执行以下命令启动数据库:

./usr/lib/postgresql/11/bin/pg_ctl  /var/lib/postgresql/11/main start

执行完以后在当前屏幕输出有“invalid primary checkpoint record”等字样,翻译之后就是检查点损坏的意思。

④   修复检查点

使用数据库自带工具对检查点进行修复,进入数据库容器,切换到postgres用户,使用PG自带工具修复,执行命令如下:

./usr/lib/postgresql/11/bin/pg_resetwal –D /var/lib/postgresql/11/main

          修复完后启动数据库进程:

                   /usr/lib/postgresql/11/bin/pg_ctl -D /var/lib/postgresql/11/main start

 

     再通过navicat工具连可正常访问数据库了。

四、总结

原因定位:异常重启或断电异常了数据文件损坏,pg数据重启后在加载数据文件时发现检查点损坏,无法正常启动。

  解决方法:使用pg自带工具进行检查点修复:

1)  进入数据库容器,切换到postgres用户;

2)  找到pg_resetwal工具,对指定数据文件进行修改,以下是本次修改的命令

./usr/lib/postgresql/11/bin/pg_resetwal –D /var/lib/postgresql/11/main

 

3)  启动数据库

./usr/lib/postgresql/11/bin/pg_ctl -D /var/lib/postgresql/11/main start

 

 

     

posted @ 2024-08-24 15:32  Runner_Jack  阅读(576)  评论(3编辑  收藏  举报