[英]How do I fix Postgres so it will start after an abrupt shutdown?
由于突然停电,我本地机器上运行的 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
如果在“写入缓存”之前显示“*”,则可能是这种情况。 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 。
您的 RAM 不好,请使用memtest86+检查至少 8 小时。
在 PostgreSQL 邮件列表的存档中阅读了一些类似的消息(“磁盘上的存储同步失败:没有这样的文件或目录”)似乎表明存在非常严重的硬件故障,比简单的电源故障要严重得多。 您可能必须准备好从备份中恢复。
也有数据库损坏,我的行为
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
我遇到了同样的问题,我正要从 db dump 转储、重新安装和导入(一个非常痛苦的过程),但是我只是尝试将其作为最后一个资源并且它起作用了!
brew services start postgresql
然后我重新启动,就是这样。
运行 start 而不是重新启动。 执行以下命令:
$pg_ctl -D /usr/local/pgsql/data start
有几次这个问题,当我的笔记本电脑意外关闭时,在后台运行 PSQL 时电池电量非常低。
搜索完后我的解决方案是, Hard delete and Reinstall
,然后从数据库转储导入数据。
Mac 使用 brew 卸载和重新安装 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
正如其他人所说,停止 + 启动而不是重新启动对我有用。 在 Docker 环境中,这将是:
docker stop <container_name>
docker start <container_name>
或使用 Docker Compose 时:
docker-compose stop
docker-compose start
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.