[英]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.