您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。 信息
问题
更新 PostgreSQL 数据库时出错。
错误消息
ERROR: PostgreSQL Upgrade FAILED
可能的原因
| 原因 | 说明 | 问题排查说明适用于 |
|---|---|---|
| PostgreSQL 配置文件中的复制设置不正确 | PostgreSQL 升级失败,原因是升级期间复制设置不正确。 | Edge Private Cloud 用户 |
| 由 apigee 用户以外的其他安装用户执行的 PostgreSQL 安装 | PostgreSQL 最初是使用其他用户作为安装用户安装的, 这会导致升级失败。 | Edge Private Cloud 用户 |
常见诊断步骤
如果您在升级 PostgreSQL 数据库时遇到错误,请先执行以下诊断步骤:
重命名 PostgreSQL 数据文件夹:
mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
确保原始备份数据位于名为
/opt/apigee/data/apigee-postgresql/pgdata-version.old/的文件夹中例如:
/opt/apigee/data/apigee-postgresql/pgdata-9.6.old/使用以下命令将
/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
重新运行
db_upgrade命令:/opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
如果您遇到以下错误...
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
重新运行
db_upgrade命令:/opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
如果问题仍然存在,请参阅原因:PostgreSQL 配置文件中的复制设置不正确。
原因:PostgreSQL 配置文件中的复制设置不正确
诊断
- 检查 PostgreSQL 配置文件
/opt/apigee/apigee-postgresql/conf/pg_hba.conf是否包含您所需的复制设置。 - 如果此文件具有预期的复制设置,请前往由“apigee”用户以外的其他安装用户执行的 PostgreSQL 安装。
- 如果不是,请前往解决方法。
解决方法
使用以下命令重命名 PostgreSQL 数据文件夹:
mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
确保原始备份数据位于名为
/opt/apigee/data/apigee-postgresql/pgdata-version.old/的文件夹中例如:
/opt/apigee/data/apigee-postgresql/pgdata-9.6.old/使用以下命令将备份数据从
/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
如果您曾更改过从属主机,则必须更新
/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重启
apigee-postgresql服务,确保在上述第 4 步中设置的属性更新到配置文件pg_hba.conf中:/opt/apigee/apigee-service/bin/apigee-service apigee-postgresql restart
使用以下命令将配置文件
pg_hba.conf设置为不可变,以确保在 PostgreSQL 升级期间不会使用错误的设置更新该文件:chattr +i /opt/apigee/apigee-postgresql/conf/pg_hba.conf
重新运行
db_upgrade命令:/opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
移除配置文件
pg_hba.conf中的不可变设置:chattr -i /opt/apigee/apigee-postgresql/conf/pg_hba.conf
原因:PostgreSQL 安装是由 apigee 用户以外的其他安装用户执行的
诊断
按照以下步骤检查是否有其他用户的 rolesuper 设置为 true:
在 PostgreSQL 节点上,使用以下命令登录 PostgreSQL:
psql -h $(hostname -i) -U apigee
运行以下 SQL 查询:
select * from pg_authid;
检查是否有多个用户的 rolesuper 设置为 true。 如果有,则表示 PostgreSQL 升级失败,因为另一个用户已被设置为安装用户,而不是 apigee 用户。任何具有 rolesuper 角色且 OID 较低的用户都被视为安装用户。
如需检查此类角色问题,请运行以下 SQL 查询:
select oid,rolname,rolsuper from pg_roles; select * from pg_user;
解决方法
使用以下命令登录 PostgreSQL:
psql -h $(hostname -i) -U apigee
将旧数据库中现有的
apigee角色重命名为临时用户(例如:apigee2):update pg_authid set rolname ='apigee2' where rolname = 'apigee';
假设还有另一个安装用户
srcapige。将srcapige角色重命名为apigee:update pg_authid set rolname ='apigee' where rolname = 'srcapigee';
将
apigee2重命名为srcapige用户:update pg_authid set rolname ='secapigee' where rolname = 'apigee2';
更新所有已重命名用户的密码:
ALTER ROLE apigee WITH PASSWORD '<secret>'; ALTER ROLE srcapige WITH PASSWORD '<secret>';使用以下命令重命名 PostgreSQL 数据文件夹:
mv /opt/apigee/data/apigee-postgresql/pgdata /opt/apigee/data/apigee-postgresql/pgdata-bkp
确保名为
/opt/apigee/data/apigee-postgresql/pgdata-version.old/的文件夹内有原始备份数据例如:
/opt/apigee/data/apigee-postgresql/pgdata-9.6.old/使用以下命令将
/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
重新运行
db_upgrade命令:/opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
重启所有
apigee-qpidd和edge-qpid-server服务:/opt/apigee/apigee-service/bin/apigee-service apigee-qpidd restart/opt/apigee/apigee-service/bin/apigee-service edge-qpid-server restart
如果问题仍然存在,请前往必须收集诊断信息。
必须收集的诊断信息
如果按照上述问题排查说明操作后问题仍然存在,请收集以下诊断信息。请与 Apigee 支持团队联系,并向支持团队提供以下信息:
- 在
/opt/apigee/apigee-postgresql/lib/actions/db_upgrade文件的第二行添加set -x。 按照常见诊断步骤操作,并将
db_upgrade命令的控制台输出提供给支持团队:opt/apigee/apigee-service/bin/apigee-service apigee-postgresql db_upgrade
向支持团队提供以下日志文件:
/opt/apigee/var/log/apigee-postgresql/apigee-postgresql.log /opt/apigee/var/log/apigee-postgresql/update.log提供以下操作系统命令的输出,以检查替代项是否设置为
auto。update-alternatives --display psql
OR
update-alternatives --display pgsqlupdate-alternatives --list如果替代项设置为
manual,您可以使用以下命令将其设置为auto:update-alternatives --auto psql
将替代项设置为
auto会将psql和postgres二进制文件指向升级后的版本。否则,二进制文件将指向旧版本,这可能会导致问题。