在 HDD 崩潰後啟動 PostgreSQL 伺服器導致 FAILED STATE
我正在
Fedora 15
使用PostgreSQL 9.1.4
. Fedora 最近崩潰了,之後:嘗試啟動 PostgreSQL 伺服器:
service postgresql-9.1 start
給
Starting postgresql-9.1 (via systemctl): Job failed. See system logs and 'systemctl status' for details. [FAILED]
雖然,當我在系統重啟後第一次啟動伺服器時,伺服器正常啟動。
但是,嘗試使用
psql
會出現此錯誤:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
.s.PGSQL.5432
文件在系統上的任何地方都不存在。Alocate .s.PGSQL.5432
什麼也不輸出。系統日誌有這個:
Aug 14 17:31:58 localhost systemd[1]: postgresql-9.1.service: control process exited, code=exited status=1 Aug 14 17:31:58 localhost systemd[1]: Unit postgresql-9.1.service entered failed state.
一種
systemctl status postgresql-9.1.service
給
postgresql-9.1.service - SYSV: PostgreSQL database server. Loaded: loaded (/etc/rc.d/init.d/postgresql-9.1) Active: failed since Tue, 14 Aug 2012 17:31:58 +0530; 58s ago Process: 2811 ExecStop=/etc/rc.d/init.d/postgresql-9.1 stop (code=exited, status=1/FAILURE) Process: 12423 ExecStart=/etc/rc.d/init.d/postgresql-9.1 start (code=exited, status=1/FAILURE) Main PID: 2551 (code=exited, status=1/FAILURE) CGroup: name=systemd:/system/postgresql-9.1.service
我沒有更改 fsync 的預設設置,所以我猜,它設置為
on
. 我在硬碟上。硬碟壞了。硬碟崩潰
HDD 崩潰導致在
fsck
提示符下執行手冊,而不是基於 gui。用它修復大量的 inode 等。之後我用Ctrl
++Alt
重新啟動了系統Delete
。PostgreSQL 的日誌是這樣的:
LOG: database system was interrupted; last known up at 2012-08-14 17:31:57 IST LOG: database system was not properly shut down; automatic recovery in progress LOG: record with zero length at 0/41A4E58 LOG: redo is not required FATAL: could not access status of transaction 1 DETAIL: Could not open file "pg_multixact/offsets/0000": No such file or directory. LOG: startup process (PID 13016) exited with exit code 1 LOG: aborting startup due to startup process failure
更新
在獲取目錄的文件系統級別副本後嘗試啟動伺服器
/var/lib/pgsql
,並執行./pg_resetxlog -f /var/lib/pgsql/9.1/data/
結果xlog -f /var/lib/pgsql/9.1/data/
仍然會產生:LOG: database system was interrupted; last known up at 2012-08-14 18:46:36 IST LOG: database system was not properly shut down; automatic recovery in progress LOG: record with zero length at 0/6000078 LOG: redo is not required FATAL: could not access status of transaction 1 DETAIL: Could not open file "pg_multixact/offsets/0000": No such file or directory. LOG: startup process (PID 13766) exited with exit code 1 LOG: aborting startup due to startup process failure
真正的答案將在 PostgreSQL 日誌中,在
/var/lib/pgsql/data/pg_log
.但是,在您採取任何行動之前:如果您的任何數據對您有價值,那麼在嘗試修復之前獲取數據庫的文件系統級副本至關重要。請參閱http://wiki.postgresql.org/wiki/Corruption。您必須複製整個數據目錄。在 Fedora 上,這
/var/lib/pgsql/data
是預設設置,但請驗證您的安裝是否正確。根據您發布的日誌,您肯定有一定程度的數據庫損壞。數據庫所在的儲存(硬碟驅動器或文件系統)很可能已損壞。立即複製,並將其放在不同的硬碟驅動器或系統上。
僅在您製作了數據目錄的完整文件系統級別副本後,嘗試使用pg_resetxlog清除損壞的事務日誌並啟動數據庫。即使它啟動它也很可能是腐敗的;你應該
pg_dump
然後重新initdb
它並將轉儲恢復到新實例。如果您仍然無法啟動它,
pg_resetxlog
請在 resetxlog 之後發布更新的啟動嘗試日誌。您可能需要以獨立模式啟動 Pg:sudo -u postgres postgres --single -D /var/lib/pgsql/data -P -f i postgres
如果可行,給你一個
backend>
提示,用你要連接的數據庫的名稱替換最後一個“postgres”後重試。您應該能夠SELECT
,COPY
來自表等的數據。如果這不起作用,即你不能啟動一個獨立的後端,那麼可能是時候從備份中恢復了——因為你足夠明智地擁有它們。如果其他閱讀本文的人處於相同的位置,請聯繫經驗豐富的 PostgreSQL 顧問,看看他們是否可以從您的數據庫中恢復數據。準備好為他們的時間和專業知識付費。
您的文件系統可能已損壞
PostgreSQL 安裝損壞的嚴重程度表明您的整個文件系統可能已損壞。您可能希望考慮從備份中恢復整個系統或重新安裝它。
我不會相信這個文件系統,
fsck
或者不相信fsck
.智能測試您的驅動器
我還建議您使用smartmontools
SMART
對您的硬碟進行檢查;smartctl
假設是/dev/hda
這樣smartctl -d ata -a /dev/sda | less
。查找失敗的執行狀況測試、uncorrectable_sectors
高讀取錯誤率、大於 2 或 3 的 reallocated_sector_count 或非零 current_pending_sector。執行smartctl -d ata -t long /dev/sda
以在您的硬碟上執行非破壞性自檢;它不會中斷系統的正常執行。當估計的時間已經過去時,smartctl -d ata /dev/sda
再次執行並查看自檢日誌以查看它是否通過。如果有任何東西看起來不夠完美,請更換驅動器。
將來,請考慮通過
smartd
對驅動器故障進行早期警告來自動化此測試。(這篇文章中的內容已因問題更新而過時。如果您正在解決類似問題,請查看此答案的編輯歷史記錄)。