PostgreSQL 升级失败

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

问题

您在更新 PostgreSQL 数据库时收到错误。

错误消息

ERROR: PostgreSQL Upgrade FAILED 

可能的原因

原因 说明 问题排查说明适用于
PostgreSQL 配置文件中的复制设置不正确 由于升级期间复制设置不正确,PostgreSQL 升级失败。 Edge Private Cloud 用户
由 apigee 用户以外的其他安装用户执行的 PostgreSQL 安装 PostgreSQL 最初是使用其他用户作为安装用户进行安装的,这导致升级失败。 边缘私有云用户

常见诊断步骤

如果您在升级 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 
    

    OR

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

    OR

    update-alternatives --list pgsql
    

    如果将备选项设置为 manual,则您可以使用以下方式将它们设置为 auto 命令:

    update-alternatives --auto psql
    

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