删除pg_xlog文件后,Postgres将无法启动

时间:2016-04-27 20:41:48

标签: postgresql postgresql-9.3

使用Debian Wheezy,Postgresql 9.3

我的数据库因为保持WAL文件已满的分区而关闭。 所以,我删除了./pg_xlog/内的所有内容,因为我不知道它们是什么(是的,我非常愚蠢)。根据syslog:

,现在Postgres服务无法启动,尽管存在问题
00000: could not open tablespace directory "pg_tblspc/16386/PG_9.3_201306121": File or directory not found
LOCAL:  RelationCacheInitFileRemoveInDir, relcache.c:4895
00000: Primary checkpoint record is invalid
LOCAL:  ReadCheckpointRecord, xlog.c:6543
00000: Secondary checkpoint record is invalid
LOCAL:  ReadCheckpointRecord, xlog.c:6547
PANIC: XX000: could not locate a valid checkpoint record
LOCAL:  StartupXLOG, xlog.c:5228

我不完全确定问题是它找不到合适的pg_tblspc还是完全没有检查点WAL文件。存储数据库的实际路径是/dados/PG_9.3_201306121。我该怎么做才能重新开始服务?

EDIT1: 好的,我已经设法让这件事重新上线了。有些数据库损坏了。我已经设法DROPDB其中两个(如果没有强制重启服务,甚至无法连接到它们)。我试着去另一个腐败的,但错误再次与xlog有关。我试过对它进行干净的恢复,但恢复不完整。然后,我创建了一个新数据库,并尝试恢复此数据库的旧备份。它也不完整。

现在我不能删除任何数据库,也不能创建新数据库,我总是遇到xlog flush request not satisfied错误。我试过运行pg_resetxlog,但它似乎没有做任何事情。错误显示的另一件事是cannot write to block 1 of pg_tblspc/16385/PG_9.3_201306121/36596452/11773write error may be permanent

EDIT2:上面的部分问题是该11773文件。我已将其重命名为11773.corrupt,现在数据库允许我再次创建和删除。

1 个答案:

答案 0 :(得分:6)

  

删除pg_xlog文件后,Postgres将无法启动

嗯,是的不要那样做。

  

如何让服务重新开始?

嗯,你的数据库已经损坏了。从备份还原。你有备份,对吗?最好是一个方便的PITR档案,如PgBarman,你可以在5分钟前恢复。否?

好的,首先,归档损坏的副本。 https://wiki.postgresql.org/wiki/Corruption

现在。如果您很幸运,pg_resetxlog将帮助您成功运行数据库的pg_dump,这样您就可以将旧的损坏的安装数据库移到一边,initdb一个新的一,并将数据库还原到它。

如果您运气不好pg_dump将无法成功,或者由于重复的主键等原因导致恢复失败。在后一种情况下,可能需要手动修复转储。如果pg_dump失败,则适当的操作将取决于失败的原因。

所以是的。不要删除pg_xlog

PostgreSQL社区内部正在讨论如何将pg_xlog重命名为更明显它是数据库的重要组成部分,并希望它能在9.7版本中完成。