修复损坏的postgresql数据库

时间:2012-01-27 14:40:13

标签: postgresql rdbms

当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

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

请告诉我在这种情况下该怎么做。

3 个答案:

答案 0 :(得分:3)

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

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

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

然后为新群集设置正确的Point-in-Time Recovery备份。

答案 1 :(得分:1)

从上次备份恢复,然后从那里重新应用日志。

除非你拥有最后一次备份和从那时起的所有日志,否则你就搞砸了。

答案 2 :(得分:0)

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

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

sudo service postgresql-9.6 restart

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