HDD崩溃后启动PostgreSQL服务器会导致FAILED STATE


10

我使用Fedora 15PostgreSQL 9.1.4。Fedora最近崩溃了,之后:

尝试启动PostgreSQL服务器:

service postgresql-9.1 start

Starting postgresql-9.1 (via systemctl):  Job failed. See system logs and 'systemctl status' for details.
                                                       [FAILED]

虽然,在系统重启后第一次启动服务器时服务器可以正常启动
但是,尝试使用psql会出现此错误:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

.s.PGSQL.5432文件在系统上任何地方都不存在。A locate .s.PGSQL.5432什么也没输出。


系统日志具有以下内容:

Aug 14 17:31:58 localhost systemd[1]: postgresql-9.1.service: control process exited, code=exited status=1
Aug 14 17:31:58 localhost systemd[1]: Unit postgresql-9.1.service entered failed state.

一个

systemctl status postgresql-9.1.service

postgresql-9.1.service - SYSV: PostgreSQL database server.
          Loaded: loaded (/etc/rc.d/init.d/postgresql-9.1)
      Active: failed since Tue, 14 Aug 2012 17:31:58 +0530; 58s ago
     Process: 2811 ExecStop=/etc/rc.d/init.d/postgresql-9.1 stop (code=exited, status=1/FAILURE)
     Process: 12423 ExecStart=/etc/rc.d/init.d/postgresql-9.1 start (code=exited, status=1/FAILURE)
    Main PID: 2551 (code=exited, status=1/FAILURE)
      CGroup: name=systemd:/system/postgresql-9.1.service

我没有更改fsync的默认设置,所以我猜测它设置为on。我在硬盘上。硬盘崩溃。

硬盘崩溃

HDD崩溃导致在fsck提示而非基于gui的情况下运行手册。用它来修复gazillion的inode等。之后,我用Ctrl+ Alt+ 重新启动了系统Delete

PostgreSQL的日志具有以下内容:

LOG:  database system was interrupted; last known up at 2012-08-14 17:31:57 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/41A4E58
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13016) exited with exit code 1
LOG:  aborting startup due to startup process failure

更新资料

在获取目录的文件系统级副本之后尝试启动服务器/var/lib/pgsql,并运行./pg_resetxlog -f /var/lib/pgsql/9.1/data/结果xlog -f /var/lib/pgsql/9.1/data/仍然会产生:

LOG:  database system was interrupted; last known up at 2012-08-14 18:46:36 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/6000078
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13766) exited with exit code 1
LOG:  aborting startup due to startup process failure

还有Postgres的日志?
Milen A. Radev 2012年

@ MilenA.Radev已经更新与Postgres的日志中的问题..
ThinkingMonkey

pg_resetxlog没有任何好处,因此您会进入有趣的领域。您是否有崩溃之前的该数据库的备份?
Craig Ringer

@CraigRinger是的,我确实有备份。我实际上很喜欢这次旅行。
ThinkingMonkey

@ThinkingMonkey太棒了!您是少数拥有良好备份的人之一:-)。老实说,您的数据库很可能是可修复的,但是由于文件系统损坏破坏了重要文件,您可能需要一个非常了解Pg胆识的人来花一些时间来获取数据。可在以下位置获得服务:postgresql.org/support/professional_support。也许如果您能pg_multixact/offsets/0000为该Pg接受一些虚拟内容,则可以接受...
Craig Ringer 2012年

Answers:


15

真正的答案将在PostgreSQL日志中/var/lib/pgsql/data/pg_log

但是,在采取任何措施之前:如果您的任何数据对您有价值,那么在尝试修复之前,请获取数据库的文件系统级副本至关重要。参见http://wiki.postgresql.org/wiki/Corruption。您必须复制整个数据目录。在Fedora上,这是/var/lib/pgsql/data默认设置,但请确认该安装正确。

根据您发布的日志,您当然有一定程度的数据库损坏。数据库所在的存储(硬盘驱动器或文件系统)很可能已损坏。立即复制,然后将其放在其他硬盘驱动器或系统上

仅在完成数据目录的文件系统级副本之后,请尝试使用pg_resetxlog清除损坏的事务日志并启动数据库。即使开始,它也很可能被损坏;您应该pg_dump重新安装initdb并将转储还原到新实例。

如果您在a pg_resetxlog之后仍然无法启动,请在resetxlog之后发布更新的启动尝试日志。您可能需要以以下方式在独立模式下启动Pg:

sudo -u postgres postgres --single -D /var/lib/pgsql/data -P -f i postgres

如果可行,则backend>提示您,将最后一个“ postgres”替换为您要连接的数据库名称后,再试一次。你应该能够SELECTCOPY从表中的数据,等等。

如果工作,即你不能启动一个独立的后台,那么很可能就是从备份中恢复-因为你是明智的,足有他们。如果其他人都处于同一位置,请联系经验丰富的PostgreSQL顾问以查看他们是否可以从您的数据库中恢复数据。准备为他们的时间和专业知识付出代价。

您的文件系统可能已损坏

PostgreSQL安装损坏的严重性表明您的整个文件系统可能已损坏。您可能希望考虑从备份还原整个系统或重新安装它。

我将不信任此文件系统,fsck否则不会fsck

智能测试您的驱动器

我还建议您SMART使用smartctlsmartmontools 对硬盘进行检查。假设是/dev/hda那样smartctl -d ata -a /dev/sda | less。查找运行状况测试失败,uncorrectable_sectors读取错误率高,reallocated_sector_count大于2或3或current_pending_sector非零。运行smartctl -d ata -t long /dev/sda以在硬盘上执行非破坏性自检;它不会中断系统的正常运行。当估计时间过去后,smartctl -d ata /dev/sda再次运行,然后查看自检日志以查看它是否已通过。

如果看起来不完美,请更换驱动器。

将来,可以考虑通过自动执行此测试来smartd提前警告驱动器故障。

(问题的更新使帖子中的内容过时。如果要解决类似问题,请查看此答案的编辑历史记录)。


我在问题中添加了postgres的日志。我没有更改默认设置,fsync所以我猜是将其设置为on。我在硬盘上。是的,硬盘崩溃了。我的磁盘空间还没有用完。无内存错误/过热/电缆跳脱/西班牙文。
ThinkingMonkey

@ThinkingMonkey什么样的“ HDD崩溃”?您是否需要在硬盘驱动器上进行数据恢复以将文件复制到新驱动器?您是否必须运行fsck并进行文件系统维修?请详细。写下您的车祸故事。
Craig Ringer

HDD崩溃导致运行手册fsck。用它来修复gazillion的inode等。之后,系统重新启动。问题中也更新了以上内容。
ThinkingMonkey

@ThinkingMonkey好,答案已更新。TL; DR:制作/ var / lib / pgsql的完整文件系统级别副本,然后运行pg_resetxlog
Craig Ringer'Aug

谢谢..复制和resetxlog。很快就会有结果。
ThinkingMonkey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.