如果應用裝置資料庫發生故障,並且當主節點發生故障時沒有資料庫節點已啟動且正在執行,或者所有複寫節點均不同步,請使用下列程序來嘗試復原資料庫。

執行這項作業的原因和時機

此程序適用於在非同步模式下執行的叢集中沒有資料庫節點正常運作的情況。在此情況下,在嘗試載入或重新整理頁面時,您通常會在 [虛擬應用裝置管理介面] 頁面上看到類似下列內容的錯誤:

初始化資料庫服務時發生錯誤: 無法開啟 JDBC 連線以進行交易;巢狀例外狀況為 org.postgresql.util.PSQLException: 連線嘗試失敗。

程序

  1. 嘗試使用虛擬應用裝置管理介面從其中一個資料庫節點復原資料庫。
    1. 如果可以,開啟具有最新狀態之節點的 [虛擬應用裝置管理介面] 資料庫頁面。通常,此節點是資料庫發生故障之前的主節點。
    2. 如果主節點的虛擬應用裝置管理介面無法開啟,請嘗試開啟其他複寫節點的介面。
    3. 如果您可以找到具有運作中虛擬應用裝置管理介面的資料庫節點,請嘗試透過執行手動容錯移轉來將其復原。
  2. 如果步驟 1 中的程序失敗,請啟動 Shell 工作階段,並嘗試判斷具有最新狀態的節點。啟動所有可用叢集節點的 Shell 工作階段,然後嘗試透過執行以下 Shell 命令啟動其資料庫:service vpostgres start
  3. 針對具有執行中本機資料庫的每個節點使用下列程序來判斷具有最新狀態的節點。
    1. 執行以下命令以判斷具有最新狀態的節點。如果命令傳回 f,則是具有最新狀態的節點,然後您可以繼續執行步驟 4。
      su - postgres
      psql vcac
      vcac=# select pg_is_in_recovery();
       pg_is_in_recovery
      • 如果此命令傳回 f,則此節點具有最新狀態。

      • 如果命令傳回 t,請在節點上執行以下命令:

      SELECT pg_last_xlog_receive_location() as receive_loc, pg_last_xlog_replay_location() as replay_loc, extract(epoch from pg_last_xact_replay_timestamp()) as replay_timestamp;

      該命令應該會傳回類似如下的結果。

      vcac=# SELECT pg_last_xlog_receive_location() as receive_loc, pg_last_xlog_replay_location() as replay_loc, extract(epoch from pg_last_xact_replay_timestamp()) as replay_timestamp;
       receive_loc | replay_loc | replay_timestamp
      -------------+------------+------------------
       0/20000000 | 0/203228A0 | 1491577215.68858
      (1 row)
      
  4. 比較每個節點的結果,以判定具有最新狀態的節點。

    receive_loc 資料行下選取具有最大值的節點。如果相等,請從 replay_loc 資料行選取最大值,如果仍相等,選取 replay_timestamp 具有最大值的節點。

  5. 在具有最新狀態的節點上執行以下命令:vcac-vami psql-promote-master -force
  6. 在文字編輯器中開啟 /etc/haproxy/conf.d/10-psql.cfg 檔案,然後更新以下行。
    server masterserver sc-rdops-vm06-dhcp-170-156.eng.vmware.com:5432 check on-marked-up shutdown-backup-sessions
    

    具有最新節點 FQDN 的行讀取如下:

    server masterserver current-node-fqdn:5432 check on-marked-up shutdown-backup-sessions
  7. 儲存檔案。
  8. 執行 service haproxy restart 命令。
  9. 針對最新節點開啟 [虛擬應用裝置管理介面] 資料庫頁面。

    此節點應顯示為主節點,其他節點應為無效的複寫。此外,複寫的重設按鈕已啟用。

  10. 連續針對每個複寫按一下重設重新整理,直到修復叢集狀態。