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 升级失败,因为另一位用户已被设置为 install user,而不是 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 
    

    OR

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

    OR

    update-alternatives --list pgsql
    

    如果备选项设为 manual,您可以使用以下命令将其设为 auto

    update-alternatives --auto psql
    

    将替代项设置为 auto 会将 psqlpostgres 二进制文件指向升级后的版本。否则,二进制文件将指向旧版本,这可能会导致出现问题。