如何修复Postgres,以便在突然关机后启动?

时间:2009-02-28 15:53:06

标签: 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个文件。什么可能是这种行为的原因,当然还有出路?

7 个答案:

答案 0 :(得分:19)

您需要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"

  • 您的磁盘发生故障并且阻塞不良,请查看badblocks

  • 内存不足,请memtest86+查询至少8小时。

答案 1 :(得分:6)

在PostgreSQL的档案中阅读一些类似的消息 邮件列表(“磁盘上的存储同步失败:没有这样的文件或 目录“)似乎表明存在非常严重的硬件 麻烦,比简单的电源故障更糟糕。您可能必须准备好从备份中恢复。

答案 2 :(得分:2)

我遇到了同样的问题,我将要转储,重新安装并从db dump中导入(这确实是一个痛苦的过程),但是我只是将它作为最后的资源尝试了,并且有效!

brew services start postgresql

然后我重新启动,就是这样。

答案 3 :(得分:1)

还有数据库损坏,我的行为

docker run -it --rm -v /path/to/db:/var/lib/postgresql/data postgres:10.3 bash
su - postgres
/usr/lib/postgresql/10/bin/pg_resetwal -D /var/lib/postgresql/data -f

答案 4 :(得分:0)

运行启动而不是重启。 执行以下命令:

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

答案 5 :(得分:0)

当我的笔记本电脑意外关闭,在后台运行PSQL时电池电量很低时,发生了几次此问题。

经过全部搜索后,我的解决方案是Hard delete and Reinstall,然后从数据库转储导入数据。

使用brew的Mac卸载并重新安装psql 9.6的步骤

brew uninstall postgresql@9.6
rm -rf rm -rf /usr/local/var/postgresql@9.6
rm -rf .psql.local .psql_history .psqlrc.local l.psqlrc .pgpass

brew install postgresql@9.6

echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

brew services start postgresql@9.6

createuser -s postgres
createuser {ENTER_YOUR_USER_HERE} --interactive

答案 6 :(得分:0)

就像其他人所说的那样,停止+启动而不是重新启动对我有效。在Docker环境中,这将是:

                A             B
0   [9, 1, 8, 11]  [0, 1, 6, 2]
1  [2, 10, 8, 11]  [2, 6, 6, 3]
2   [9, 4, 7, 10]  [2, 1, 1, 2]

或使用Docker Compose时:

docker stop <container_name>
docker start <container_name>