使用Debian Wheezy,Postgresql 9.3
我的数据库因为保持WAL文件已满的分区而关闭。
所以,我删除了./pg_xlog/
内的所有内容,因为我不知道它们是什么(是的,我非常愚蠢)。根据syslog:
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/11773
,write error may be permanent
。
EDIT2:上面的部分问题是该11773文件。我已将其重命名为11773.corrupt,现在数据库允许我再次创建和删除。
答案 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版本中完成。