PostgreSQL 10无法启动:主/副检查点无效,求无备份恢复方案
PostgreSQL 10 检查点错误修复方案(无需备份/备份恢复)
一、无需备份的应急修复步骤
注意:以下操作存在数据丢失风险,仅在无备份可用时尝试,操作前务必完整拷贝数据目录(默认路径/var/lib/postgresql/10/main)到安全存储位置。
修改配置启用强制恢复
- 编辑配置文件:
sudo vi /etc/postgresql/10/main/postgresql.conf - 添加或修改参数:
recovery_target_time = '2023-10-26 07:17:31' # 填写日志中"database system is shut down"对应的时间 recovery_target_action = 'promote' - 若上述参数无效,尝试临时添加:
ignore_system_indexes = on
- 编辑配置文件:
单用户模式修复索引
- 终止所有PostgreSQL进程:
sudo pkill -9 postgres - 切换至postgres用户:
sudo su - postgres - 启动单用户模式:
postgres --single -D /var/lib/postgresql/10/main - 进入后执行索引重建:
REINDEX DATABASE your_db_name;(替换为你的实际数据库名),输入\q退出。
- 终止所有PostgreSQL进程:
强制启动数据库
- 执行启动命令:
sudo pg_ctl -D /var/lib/postgresql/10/main start -m fast - 启动成功后立即执行全量备份:
pg_dumpall -f /safe/path/full_backup.sql
- 执行启动命令:
二、基于备份的安全恢复实践
若有可用备份,优先采用此方案:
停止PostgreSQL服务
sudo systemctl stop postgresql
清理损坏的数据目录
sudo rm -rf /var/lib/postgresql/10/main/*
恢复全量备份
- 切换至postgres用户:
sudo su - postgres - 导入备份:
psql -f /path/to/your/full_backup.sql postgres
- 切换至postgres用户:
应用增量WAL日志(若启用归档)
- 将WAL归档文件拷贝至指定目录,修改
postgresql.conf中的restore_command指向归档路径,启动数据库自动完成增量恢复。
- 将WAL归档文件拷贝至指定目录,修改
验证数据完整性
- 启动服务:
sudo systemctl start postgresql - 连接数据库,通过查询关键表数据(如
SELECT count(*) FROM your_table;)确认数据完整。
- 启动服务:
三、后续预防措施
- 修改
pg_hba.conf后,优先使用pg_ctl reload或sudo systemctl reload postgresql重载配置,无需重启服务。 - 如需重启,先执行
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid();终止所有连接,再执行优雅关闭:sudo systemctl stop postgresql。 - 配置定期自动全量备份,启用WAL归档,确保数据可恢复。
内容的提问来源于stack exchange,提问作者syer
相关产品推荐
相关产品推荐

