23

由于突然断电,在我的本地机器上运行的 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文件。这种行为的原因可能是什么,当然出路是什么?

4

7 回答 7

28

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

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

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

    hdparm -I /dev/sda

    如果它在“写入缓存”之前显示“*”,那么可能就是这种情况。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 小时。

于 2009-03-02T10:58:05.663 回答
6

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

于 2009-02-28T17:57:00.743 回答
2

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

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
于 2018-04-30T20:31:56.513 回答
2

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

brew services start postgresql

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

于 2020-07-06T16:21:40.733 回答
1

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

$pg_ctl -D /usr/local/pgsql/data start
于 2009-08-07T05:06:40.013 回答
0

有几次这个问题,当我的笔记本电脑意外关闭时,在后台运行 PSQL 时电池电量非常低。

搜索完后我的解决方案是Hard delete and Reinstall,然后从 db dump 导入数据。

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

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

于 2020-06-26T12:49:48.200 回答
0

正如其他人所说,停止+开始而不是重新启动对我有用。在 Docker 环境中,这将是:

docker stop <container_name>
docker start <container_name>

或者在使用 Docker Compose 时:

docker-compose stop
docker-compose start
于 2020-08-04T01:23:28.827 回答