postgresql - 我如何修复 Postgres 以便它在突然关闭后启动?

标签 postgresql recovery

由于突然断电,运行在我本地机器上的 Postgres 服务器突然关闭。重新启动后,我尝试重新启动 Postgres,但出现此错误:

$ pg_ctl -D/usr/local/pgsql/data restart

pg_ctl: PID file "/usr/local/pgsql/data/postmaster.pid" does not exist
Is server running?
starting server anyway
server starting
$:/usr/local/pgsql/data$ LOG:  database system shutdown was interrupted at 2009-02-28 21:06:16 
LOG:  checkpoint record is at 2/8FD6F8D0
LOG:  redo record is at 2/8FD6F8D0; undo record is at 0/0; shutdown FALSE
LOG:  next transaction ID: 0/1888104; next OID: 1711752
LOG:  next MultiXactId: 2; next MultiXactOffset: 3
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  redo starts at 2/8FD6F918
LOG:  record with zero length at 2/8FFD94A8
LOG:  redo done at 2/8FFD9480
LOG:  could not fsync segment 0 of relation 1663/1707047/1707304: No such file or directory
FATAL:  storage sync failed on magnetic disk: No such file or directory
LOG:  startup process (PID 5465) exited with exit code 1
LOG:  aborting startup due to startup process failure

数据目录中没有postmaster.pid 文件。这种行为的原因可能是什么,当然出路是什么?

最佳答案

你需要 pg_resetxlog .不过,在此之后您的数据库可能处于不一致状态,因此请使用 pg_dumpall 转储它,重新创建并导入回来。

造成这种情况的原因可能是:

  • 您还没有关闭硬件 在磁盘上写入缓存,这通常 防止操作系统在报告成功写入应用程序之前确保数据已写入。检查

    hdparm -I/dev/sda

    如果它在“写入缓存”之前显示“*”,则可能是这种情况。 Source of PostgreSQL有一个程序src/tools/fsync/test_fsync.c,测试数据与磁盘同步的速度。运行它 - 如果它报告的所有时间都比你的磁盘对操作系统说谎的时间短 3 秒 - 在 7500rpm 磁盘上,对同一位置进行 1000 次写入的测试至少需要 8 秒才能完成 (1000/(7500rpm/60s)) 因为它每条路线只能写一次。如果您的数据库位于/var/tmp 分区之外的另一个磁盘上,则需要编辑此 test_fsync.c - 更改

    #define FSYNC_FILENAME "/var/tmp/test_fsync.out"

    #define FSYNC_FILENAME "/usr/local/pgsql/data/test_fsync.out"

  • 您的磁盘出现故障并且有坏 block ,请检查 badblocks .

  • 您的 RAM 有问题,请查看 memtest86+至少 8 小时。

关于postgresql - 我如何修复 Postgres 以便它在突然关闭后启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/598200/

相关文章:

java - 如何从旧的 __jb_bak__ 或 __jb_old__ 文件恢复

sql - 错误 : operator does not exist: integer = integer[]

java - 在 Lambda 函数中获取返回值

postgresql - 使用多个模式或按 customerId 表列实现 Multi-Tenancy 数据结构

mongodb - 我怎么知道 MongoDB 恢复何时结束

git - 从 Git 对象恢复文件

postgresql - Ecto 构建多个关联

sql - PostgreSQL,从连接表中获取列名

svn - 如何恢复 svn 存储库中意外删除的文件夹

从崩溃的服务器中恢复 MySQL 表