修复损坏的postgresql数据库

sirbozc5  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(4)|浏览(208)

这是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

知道我并不是不走运,在这种情况下,我可以使用一个命令来修复数据库。只要数据库变得一致,最近几个小时的事务是否消失并不重要。
请告诉我在这种情况下该怎么办。

c0vxltue

c0vxltue1#

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

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

sudo service postgresql-9.6 restart

更改错误消息中显示的文件名/版本。

a7qyws3x

a7qyws3x2#

这取决于你愿意在数据方面给予多少。
你可以在postgresql.conf配置文件中将zero_damaged_pages设置为on,然后给予一下--但是这会导致数据丢失,可能会成功,也可能不会成功。
如果您想尝试这样做,总是首先关闭postgres数据库并获取它的完整文件系统副本(例如tar)。因为它可能仍然是你所拥有的最不坏的版本。然后一旦你设置好它,马上运行一个pg_dump,擦除集群,并恢复转储。绝对不要在默认情况下运行zero_damaged_pages的新集群。记得把它关掉!
然后为新群集设置正确的时间点恢复备份。

ct2axkht

ct2axkht3#

从上次备份恢复,然后从那里重新应用日志。
除非你有最后的备份和所有的日志,否则你就完蛋了。

7jmck4yq

7jmck4yq4#

在我的情况下,我得到了以下错误:

LOG:  could not open directory "pg_tblspc/ui6h1i/PG_13_202007201/pgsql_tmp": Not a directory
LOG:  could not open directory "pg_tblspc/ui6h1i/PG_13_202007201": Not a directory

原来/var/lib/postgresql/data/pg_tblspc/ui6h1i实际上是一个可执行文件而不是目录。我对数据文件夹进行了备份,然后删除了ui6h1i。Postgres随后能够启动,并且似乎正在工作。
(使用postgres 13)

相关问题