You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORDS启动报|apex||连接池用户名密码无效/过期/锁定如何解决

问题背景

运行环境为Oracle 19.3 CDB多租户数据库,已成功安装APEX 21,当前正在开展ORDS配置工作。

已完成校验项

  • 已确认CDB$root容器下的ORDS_PUBLIC_USER账户处于解锁状态,密码配置正确,执行的校验SQL如下:
alter session set container=cdb$root;
select * from dba_users where username = 'ORDS_PUBLIC_USER';
  • 已确认pdb1容器下所有APEX相关用户均处于解锁状态,密码配置正确,执行的校验SQL如下:
alter session set container=pdb1;
select * from dba_users order by username;

故障现象

执行如下命令启动ORDS时抛出错误:

java -jar ords.war standalone

报错信息:

The username or password for the connection pool named |apex||, are invalid, expired, or the account is locked

因不熟悉多租户数据库架构,无法定位配置错误点,当前使用的ORDS配置文件内容如下:

<properties>
<comment>Saved on Sat Jun 25 02:35:58 CEST 2022</comment>
<entry key="cache.caching">false</entry>
<entry key="cache.directory">/tmp/apex/cache</entry>
<entry key="cache.duration">days</entry>
<entry key="cache.expiration">7</entry>
<entry key="cache.maxEntries">500</entry>
<entry key="cache.monitorInterval">60</entry>
<entry key="cache.procedureNameList"/>
<entry key="cache.type">lru</entry>
<entry key="database.api.enabled">true</entry>
<entry key="db.connectionType">basic</entry>
<entry key="db.hostname">somehost</entry>
<entry key="db.port">1521</entry>
<entry key="db.servicename">something.com</entry>
<entry key="debug.debugger">false</entry>
<entry key="debug.printDebugToScreen">false</entry>
<entry key="error.keepErrorMessages">true</entry>
<entry key="error.maxEntries">50</entry>
<entry key="feature.sdw">true</entry>
<entry key="jdbc.DriverType">thin</entry>
<entry key="jdbc.InactivityTimeout">1800</entry>
<entry key="jdbc.InitialLimit">3</entry>
<entry key="jdbc.MaxConnectionReuseCount">1000</entry>
<entry key="jdbc.MaxLimit">10</entry>
<entry key="jdbc.MaxStatementsLimit">10</entry>
<entry key="jdbc.MinLimit">1</entry>
<entry key="jdbc.statementTimeout">900</entry>
<entry key="log.logging">false</entry>
<entry key="log.maxEntries">50</entry>
<entry key="misc.compress"/>
<entry key="misc.defaultPage">apex</entry>
<entry key="restEnabledSql.active">true</entry>
<entry key="security.disableDefaultExclusionList">false</entry>
<entry key="security.maxEntries">2000</entry>
<entry key="security.requestValidationFunction">wwv_flow_epg_include_modules.authorize</entry>
<entry key="security.validationFunctionType">plsql</entry>
</properties>

问题根因

这个报错是多租户环境下ORDS配置的典型问题,当前配置有两个核心错误:

  1. 连接目标错误:配置文件里db.servicename填的是CDB根容器的服务名,但APEX装在PDB1里,ORDS连CDB根容器时根本访问不到PDB1内的APEX对象和对应账户。|apex||连接池是ORDS为APEX预留的、指向APEX所在容器的连接池,连错容器自然校验失败。
  2. 校验逻辑遗漏:只检查了CDB$ROOT下的ORDS_PUBLIC_USER和PDB1里的APEX自带用户,没检查PDB1内是否存在ORDS_PUBLIC_USER、是否解锁、密码是否正确。多租户环境下ORDS_PUBLIC_USER默认不是跨容器公共用户,每个要对接ORDS的PDB都得单独创建该用户、授权、配置密码。
修复步骤
  1. 补全PDB1内的ORDS_PUBLIC_USER配置
    切到PDB1容器执行以下SQL,用户不存在就创建,存在就直接解锁改密、授权:
    alter session set container=pdb1;
    -- 用户存在就跳过创建语句,直接执行改密解锁
    create user ORDS_PUBLIC_USER identified by 你设置的符合密码规则的密码;
    alter user ORDS_PUBLIC_USER account unlock;
    grant create session to ORDS_PUBLIC_USER;
    -- 执行ORDS解压目录下的授权脚本,路径替换为你实际的ORDS脚本存放路径
    @/opt/ords/scripts/ords_installer_privs.sql ORDS_PUBLIC_USER
    
  2. 修正ORDS数据库连接配置
    先查PDB1对应的真实服务名,在PDB1容器下执行:
    alter session set container=pdb1;
    select name from v$services;
    
    把配置文件里db.servicename的值改成上面查询到的PDB1服务名,不要填CDB根的服务名。
  3. 重置ORDS连接池密码缓存
    执行以下命令重新录入连接信息,覆盖旧的错误密码配置:
    java -jar ords.war configdir /你实际存放ORDS配置文件的目录路径
    java -jar ords.war setup
    
    按照向导提示输入正确的PDB1监听地址、端口、服务名、ORDS_PUBLIC_USER密码即可。
  4. 重启ORDS验证
    重新执行启动命令:
    java -jar ords.war standalone
    

补充说明:如果你是把APEX安装在CDB$ROOT作为公共应用供所有PDB共用,那需要额外在ORDS配置里加db.serviceNameSuffix参数,值为CDB对应的DB_DOMAIN,同时确保所有对接的PDB里都创建了ORDS_PUBLIC_USER并授权。但这种部署模式官方已经不推荐,生产环境优先用PDB本地安装APEX、ORDS直连PDB服务的架构。


内容的提问来源于stack exchange,提问作者Thomas Carlton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:00:59