PostgreSQL 升級失敗

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

更新 PostgreSQL 資料庫時發生錯誤。

錯誤訊息

ERROR: PostgreSQL Upgrade FAILED 

可能原因

原因 說明 疑難排解指示適用於
PostgreSQL 設定檔的複製設定不正確 升級期間複製設定有誤,因此 PostgreSQL 升級失敗。 Edge Private Cloud 使用者
由 Apigee 使用者以外的其他安裝使用者執行的 PostgreSQL 安裝作業 PostgreSQL 最初是以安裝使用者身分安裝,導致升級失敗。 Edge Private Cloud 使用者

常見診斷步驟

如果在升級 PostgreSQL 資料庫時發生錯誤,請先執行下列診斷步驟:

  1. 重新命名 PostgreSQL 資料夾:

    mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
    
  2. 確認原始備份資料位於名為「/opt/apigee/data/apigee-postgresql/pgdata-version.old/」的資料夾

    例如:

    /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/
    
  3. 使用下列指令將 /opt/apigee/data/apigee-postgresql/pgdata-version.old/ 中的備份資料還原至 /opt/apigee/data/apigee-postgresql/pgdata

    mv /opt/apigee/data/apigee-postgresql/pgdata-version.old/ /opt/apigee/data/apigee-postgresql/pgdata 
    

    例如:

    mv /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/ /opt/apigee/data/apigee-postgresql/pgdata
  4. 重新執行 db_upgrade 指令:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
    
  5. 如果收到追蹤錯誤訊息...

    pg_resetxlog: could not open file "global/pg_control" for reading:
    No such file or directory
    

    ...接著使用下列指令,將 pg_control.old 檔案重新命名為 pg_control

    mv /apigee/apigeeinst/data/apigee-postgresql/pgdata/global/pg_control.old /apigee/apigeeinst/data/apigee-postgresql/pgdata/global/pg_control 
    
  6. 重新執行 db_upgrade 指令:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
    

    如果問題仍未解決,請參閱原因:PostgreSQL 設定檔中複製的設定不正確

原因:PostgreSQL 設定檔中複製設定不正確

診斷方式

  1. 請檢查 PostgreSQL 設定檔 /opt/apigee/apigee-postgresql/conf/pg_hba.conf 是否有所需的複製設定。
  2. 如果這個檔案有預期的複製設定,請參閱「apigee」使用者以外的其他安裝使用者執行的 PostgreSQL 安裝作業相關說明。
  3. 如果並非如此,請前往「解決」

解析度

  1. 使用下列指令重新命名 PostgreSQL 資料資料夾:

    mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
    
  2. 確認原始備份資料位於名為 /opt/apigee/data/apigee-postgresql/pgdata-version.old/ 的資料夾中

    例如:

    /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/
    
  3. 使用下列指令,將備份資料從 /opt/apigee/data/apigee-postgresql/pgdata-version.old/ 還原至 /opt/apigee/data/apigee-postgresql/pgdata

    mv /opt/apigee/data/apigee-postgresql/pgdata-version.old/ /opt/apigee/data/apigee-postgresql/pgdata 
    

    例如:

    mv /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/ /opt/apigee/data/apigee-postgresql/pgdata 
    
  4. 如果您曾變更從屬主機,則必須更新 /opt/apigee/customer/application/postgresql.properties 中的下列屬性,才能更新設定檔 pg_hba.conf

    conf_pg_hba_replication.connection=host replication apigee
    existing_slave_ip/32 trust\ \nhost replication apigee new_slave_ip/32 trust 
    
  5. 重新啟動 apigee-postgresql 服務,確保在上述步驟 4 中設定的屬性更新為 pg_hba.conf 設定檔:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql restart
    
  6. 使用下列指令讓設定檔 pg_hba.conf 不可變更,以確保在 PostgreSQL 升級期間不會以不正確的設定更新設定檔:

    chattr +i /opt/apigee/apigee-postgresql/conf/pg_hba.conf 
    
  7. 重新執行 db_upgrade 指令:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
    
  8. 移除設定檔 pg_hba.conf 的不可變動設定:

    chattr -i /opt/apigee/apigee-postgresql/conf/pg_hba.conf
    

原因:apigee 以外的其他安裝使用者執行了 PostgreSQL 安裝作業

診斷方式

  1. 請按照下列步驟,查看是否有其他使用者將 rolesuper 設為 true

    1. 在 PostgreSQL 節點中,使用以下指令登入 PostgreSQL:

      psql -h $(hostname -i)  -U apigee
      
    2. 執行下列 SQL 查詢:

      select * from pg_authid;
      
    3. 查看是否有多位使用者將 rolesuper 設為 true。如果有,代表 PostgreSQL 升級失敗,因為其他使用者將其他使用者設為「安裝使用者」,而非「apigee」。系統會將任何具備「rolesuper」角色和較低 OID 的使用者視為安裝使用者。

      如要檢查這類角色問題,請執行下列 SQL 查詢:

      select oid,rolname,rolsuper from pg_roles;
      select * from pg_user;
      

解析度

  1. 使用下列指令登入 PostgreSQL:

    psql -h $(hostname -i)  -U apigee
    
  2. 將舊資料庫中現有的「apigee」角色重新命名為臨時使用者 (例如:apigee2):

    update pg_authid set rolname ='apigee2' where rolname = 'apigee'; 
    
  3. 假設有另一位安裝使用者 srcapige,將 srcapige 角色重新命名為 apigee

    update pg_authid set rolname ='apigee' where rolname = 'srcapigee';
    
  4. apigee2 重新命名為 srcapige 使用者:

    update pg_authid set rolname ='secapigee' where rolname = 'apigee2'; 
    
  5. 更新所有重新命名使用者的密碼:

    ALTER ROLE apigee WITH PASSWORD '<secret>'; 
    ALTER ROLE srcapige WITH PASSWORD '<secret>'; 
    
  6. 使用下列指令重新命名 PostgreSQL 資料資料夾:

    mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
    
  7. 確認名為 /opt/apigee/data/apigee-postgresql/pgdata-version.old/ 的資料夾內有原始備份資料

    例如:

    /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/
    
  8. 使用下列指令將 /opt/apigee/data/apigee-postgresql/pgdata-version.old/ 資料夾中的資料還原至 /opt/apigee/data/apigee-postgresql/pgdata

    mv /opt/apigee/data/apigee-postgresql/pgdata-version.old/ /opt/apigee/data/apigee-postgresql/pgdata 
    

    例如:

    mv /opt/apigee/data/apigee-postgresql/pgdata-9.6.old/ /opt/apigee/data/apigee-postgresql/pgdata 
    
  9. 重新執行 db_upgrade 指令:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade 
    
  10. 重新啟動所有 apigee-qpiddedge-qpid-server 服務:

    /opt/apigee/apigee-service/bin/apigee-service apigee-qpidd restart
    /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server restart
    

如果問題仍未解決,請參閱「必須收集診斷資訊」。

必須收集診斷資訊

如果按照上述疑難排解步驟操作後問題仍未解決,請收集下列診斷資訊。請與 Apigee 支援團隊聯絡,並將這項資訊提供給支援團隊:

  1. /opt/apigee/apigee-postgresql/lib/actions/db_upgrade 檔案的第二行中加入 set -x
  2. 按照常見診斷步驟操作,並將 db_upgrade 指令的主控台輸出內容提供給支援團隊:

    opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
    
  3. 請將下列記錄檔提供給支援團隊:

    /opt/apigee/var/log/apigee-postgresql/apigee-postgresql.log
    /opt/apigee/var/log/apigee-postgresql/update.log
    
  4. 提供下列作業系統指令的輸出內容,檢查替代設定是否設為 auto

    update-alternatives --display psql 
    

    update-alternatives --display pgsql
    update-alternatives --list psql
    

    update-alternatives --list pgsql
    

    如果替代方案設為 manual,您可以使用下列指令將替代選項設為 auto

    update-alternatives --auto psql
    

    設定 auto 的替代方案會將 psqlpostgres 二進位檔指向已升級的版本。否則,二進位檔會指向舊版,這可能會造成問題。