一、问题
数据库断电后,启动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