修复损坏的 postgresql 数据库

Bjö*_*ist 6 postgresql

这是当 postgresql 尝试在电源故障后启动时发生的情况:

2012-01-27 18:00:44 MSK LOG:  database system was interrupted while in recovery at 2012-01-27 18:00:16 MSK
2012-01-27 18:00:44 MSK HINT:  This probably means that some data is corrupted and you will have to use the last backup for recovery.
2012-01-27 18:00:44 MSK LOG:  database system was not properly shut down; automatic recovery in progress
2012-01-27 18:00:44 MSK LOG:  consistent recovery state reached at 17/762C39B8
2012-01-27 18:00:44 MSK LOG:  redo starts at 17/761F6A40
2012-01-27 18:00:44 MSK FATAL:  invalid page header in block 311757 of relation base/26976/27977
2012-01-27 18:00:44 MSK CONTEXT:  xlog redo insert: rel 1663/26976/27977; tid 311757/44
2012-01-27 18:00:44 MSK LOG:  startup process (PID 392) exited with exit code 1
2012-01-27 18:00:44 MSK LOG:  aborting startup due to startup process failure
Run Code Online (Sandbox Code Playgroud)

知道我运气不错,在这种情况下我可以使用一个命令来修复数据库。只要数据库保持一致,最后几个小时的事务消失并不重要。

请建议我在这种情况下该怎么做。

c.s*_*ala 5

我使用以下命令修复了它:

mkdir -p /var/run/postgresql/9.6-main.pg_stat_tmp

sudo service postgresql-9.6 restart
Run Code Online (Sandbox Code Playgroud)

更改文件名/版本,如错误消息中所示。


Mag*_*der 3

取决于您愿意在数据方面放弃多少。

您可以zero_damaged_pages在 postgresql.conf 配置文件中将其设置为 on,然后尝试一下 - 但这导致数据丢失。它可能有效,也可能无效。

如果您想尝试这样做,请始终从关闭 postgres 数据库并获取其完整文件系统副本(例如 tar)开始。因为它可能仍然是您拥有的损坏最少的版本。设置完成后,pg_dump立即运行,擦除集群并恢复转储。并且绝对不要在zero_damaged_pages默认情况下运行新集群,记住将其重新关闭!

然后为新集群设置适当的时间点恢复备份。