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