Linux

在 HDD 崩潰後啟動 PostgreSQL 伺服器導致 FAILED STATE

  • August 15, 2012

我正在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”後重試。您應該能夠SELECTCOPY來自表等的數據。

如果這不起作用,即你不能啟動一個獨立的後端,那麼可能是時候從備份中恢復了——因為你足夠明智地擁有它們。如果其他閱讀本文的人處於相同的位置,請聯繫經驗豐富的 PostgreSQL 顧問,看看他們是否可以從您的數據庫中恢復數據。準備好為他們的時間和專業知識付費。

您的文件系統可能已損壞

PostgreSQL 安裝損壞的嚴重程度表明您的整個文件系統可能已損壞。您可能希望考慮從備份中恢復整個系統或重新安裝它。

我不會相信這個文件系統,fsck或者不相信fsck.

智能測試您的驅動器

我還建議您使用smartmontoolsSMART對您的硬碟進行檢查;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對驅動器故障進行早期警告來自動化此測試。

(這篇文章中的內容已因問題更新而過時。如果您正在解決類似問題,請查看此答案的編輯歷史記錄)。

引用自:https://dba.stackexchange.com/questions/22486