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配置的典型问题,当前配置有两个核心错误:
- 连接目标错误:配置文件里
db.servicename填的是CDB根容器的服务名,但APEX装在PDB1里,ORDS连CDB根容器时根本访问不到PDB1内的APEX对象和对应账户。|apex||连接池是ORDS为APEX预留的、指向APEX所在容器的连接池,连错容器自然校验失败。 - 校验逻辑遗漏:只检查了CDB$ROOT下的
ORDS_PUBLIC_USER和PDB1里的APEX自带用户,没检查PDB1内是否存在ORDS_PUBLIC_USER、是否解锁、密码是否正确。多租户环境下ORDS_PUBLIC_USER默认不是跨容器公共用户,每个要对接ORDS的PDB都得单独创建该用户、授权、配置密码。
修复步骤
- 补全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 - 修正ORDS数据库连接配置
先查PDB1对应的真实服务名,在PDB1容器下执行:
把配置文件里alter session set container=pdb1; select name from v$services;db.servicename的值改成上面查询到的PDB1服务名,不要填CDB根的服务名。 - 重置ORDS连接池密码缓存
执行以下命令重新录入连接信息,覆盖旧的错误密码配置:
按照向导提示输入正确的PDB1监听地址、端口、服务名、ORDS_PUBLIC_USER密码即可。java -jar ords.war configdir /你实际存放ORDS配置文件的目录路径 java -jar ords.war setup - 重启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
相关产品推荐
相关产品推荐

