简体   繁体   English

如何修复 Postgres 使其在突然关闭后启动?

[英]How do I fix Postgres so it will start after an abrupt shutdown?

Due to a sudden power outage, the Postgres server running on my local machine shut down abruptly.由于突然停电,我本地机器上运行的 Postgres 服务器突然关闭。 After rebooting, I tried to restart Postgres and I get this error:重新启动后,我尝试重新启动 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

There is no postmaster.pid file in the data directory.数据目录中没有postmaster.pid文件。 What possibly could be the reason for this sort of behavior and of course what is the way out?这种行为的原因可能是什么,当然还有什么出路?

You'd need to pg_resetxlog .你需要pg_resetxlog Your database can be in an inconsistent state after this though, so dump it with pg_dumpall , recreate and import back.在此之后,您的数据库可能处于不一致状态,因此请使用pg_dumpall转储它,重新创建并导入回来。

A cause for this could be:造成这种情况的原因可能是:

  • You have not turned off hardware write cache on disk, which often prevents the OS from making sure data is written before it reports successful write to application.您尚未关闭磁盘上的硬件写入缓存,这通常会阻止操作系统在向应用程序报告成功写入之前确保数据已写入。 Check with检查

    hdparm -I /dev/sda

    If it shows "*" before "Write cache" then this could be the case.如果在“写入缓存”之前显示“*”,则可能是这种情况。 Source of PostgreSQL has a program src/tools/fsync/test_fsync.c, which tests speed of syncing data with disk. PostgreSQL 的源码有一个程序 src/tools/fsync/test_fsync.c,用来测试数据与磁盘同步的速度。 Run it - if it reports all times shorter than, say, 3 seconds than your disk is lying to OS - on a 7500rpm disks a test of 1000 writes to the same place would need at least 8 seconds to complete (1000/(7500rpm/60s)) as it can only write once per route.运行它——如果它报告的所有时间都比你的磁盘对操作系统说谎的时间短 3 秒——在 7500rpm 的磁盘上,对同一位置进行 1000 次写入的测试至少需要 8 秒才能完成 (1000/(7500rpm/ 60s)) 因为它只能在每个路由中写入一次。 You'd need to edit this test_fsync.c if your database is on another disk than /var/tmp partition - change如果您的数据库位于 /var/tmp 分区以外的其他磁盘上,则需要编辑此 test_fsync.c - 更改

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

    to

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

  • Your disk is failing and has a bad block, check with badblocks .您的磁盘出现故障并且有坏块,请检查badblocks

  • You have a bad RAM, check with memtest86+ for at least 8 hours.您的 RAM 不好,请使用memtest86+检查至少 8 小时。

Reading a few similar messages in the archives of the PostgreSQL mailing list ("storage sync failed on magnetic disk: No such file or directory") seems to indicate that there is a very serious hardware trouble, much worse than a simple power failure.在 PostgreSQL 邮件列表的存档中阅读了一些类似的消息(“磁盘上的存储同步失败:没有这样的文件或目录”)似乎表明存在非常严重的硬件故障,比简单的电源故障要严重得多。 You may have to prepare yourself to restore from backups.您可能必须准备好从备份中恢复。

Had db corruption too, my actions也有数据库损坏,我的行为

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

I had this same problem and I was about to dump, reinstall and import from db dump (a really painfull process), however I just tried this as the last resource and it worked!我遇到了同样的问题,我正要从 db dump 转储、重新安装和导入(一个非常痛苦的过程),但是我只是尝试将其作为最后一个资源并且它起作用了!

brew services start postgresql

Then I restarted and that was it.然后我重新启动,就是这样。

Run start instead of restart.运行 start 而不是重新启动。 Execute the below command:执行以下命令:

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

Had this problem a couple of times, when my laptop turned off unexpectedly, when on very low battery while running PSQL in the background.有几次这个问题,当我的笔记本电脑意外关闭时,在后台运行 PSQL 时电池电量非常低。

My solution after searching all over was, Hard delete and Reinstall , then import data from db dump.搜索完后我的解决方案是, Hard delete and Reinstall ,然后从数据库转储导入数据。

Steps for Mac with brew to uninstall and reinstall psql 9.6 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

As others stated, a stop + start instead of a restart worked for me.正如其他人所说,停止 + 启动而不是重新启动对我有用。 In a Docker environment this would be:在 Docker 环境中,这将是:

docker stop <container_name>
docker start <container_name>

or when using Docker Compose:或使用 Docker Compose 时:

docker-compose stop
docker-compose start

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM