pgsql安装目录:/data/server/pgsql
pgsql数据库存放目录:/data/server/pgsql/data
故障现象:因为磁盘爆满导致数据库目录下pg_wal里的文件丢失或损坏,数据库无法启动,报错。
报错信息:
2023-11-13 17:29:07.005 CST [152671] FATAL: the database system is starting up
2023-11-13 17:29:07.019 CST [152668] LOG: invalid primary checkpoint record
2023-11-13 17:29:07.019 CST [152668] PANIC: could not locate a valid checkpoint record
2023-11-13 17:29:07.070 CST [152667] LOG: startup process (PID 152668) was terminated by signal 6: Aborted
2023-11-13 17:29:07.070 CST [152667] LOG: aborting startup due to startup process failure
2023-11-13 17:29:07.100 CST [152667] LOG: database system is shut down
信息解读:
根据日志信息,发现数据库系统启动过程中遇到了问题。具体原因可能是:
数据库系统异常关闭:在上次已知的正常运行时间(2023-11-12 16:01:09 CST)之后,数据库系统可能遭遇了意外关闭,导致启动过程中出现问题。
检查点记录无效:出现了“invalid primary checkpoint record”和“could not locate a valid checkpoint record”等错误信息,这表明检查点记录可能丢失或损坏,导致数据库无法正确启动。
问题修复:
使用pg_resetwal工具重置 PostgreSQL 数据库集群的预写日志和其他控制信息。
mv /data/server/pgsql/data/pg_wal /data/server/pgsql/data/pg_wal.bak
mkdir -p /data/server/pgsql/data/pg_wal
cd /data/server/pgsql/bin
./pg_resetwal -f /data/server/pgsql/data #修复
Write-ahead log reset #有提示信息说明修复成功
/data/server/pgsql/bin/pg_ctl -D /data/server/pgsql/data -l /data/server/pgsql/data/pg_server.log start #启动数据库,修复完成。
备注:这种方法一般只能修复主库,从库需要重新同步主库。
#关闭数据库
sh /data/server/pgsql/pgsql.sh stop #停止
rm -rf /data/server/pgsql/data/* #清空目录
#从库执行数据同步
/data/server/pgsql/bin/pg_basebackup -Fp --progress -D /data/server/pgsql/data -R -h 192.168.236.136 -p 5432 -U repl --password
至此,PostgreSQL数据库pg_wal目录文件损坏修复完成。