Oracle 数据库连接失败问题排查
Oracle 数据库连接失败问题排查
问题现象
应用启动正常,业务功能在此前一段时间内一直可以正常访问 Oracle 数据库。
在运行过程中,当应用执行数据表信息查询操作时,突然出现数据库访问异常,具体表现为:
- 页面或接口在查询数据库表数据时失败
- 应用日志中出现数据库连接异常
- 原本正常的 SQL 查询无法执行
应用日志报错信息如下:
Failed to initialize pool: IO Error: The Network Adapter could not establish the connection
com.zaxxer.hikari.pool.HikariPool$PoolInitializationException
该问题并非发生在应用启动阶段,而是在应用运行过程中访问 Oracle 数据库时触发。
补充说明
- 问题发生前,应用已稳定运行
- 应用侧代码及配置近期无变更
- Oracle 数据库由公司其他人员维护,非当前人员日常负责范围
- 应用侧无法主动恢复数据库连接
环境信息
- 数据库:Oracle 19c
- 操作系统:Linux
- Oracle 运行用户:zzyoradmin
- 监听端口:1521
- 数据库实例:ORCLCDB
- PDB:ORCLPDB1
- 业务 Service:CAIWU / ORCLJIAOWU
- 连接池:HikariCP
问题定位过程
-
网络连通性确认
-
数据库 IP 可 ping 通
-
网络层无异常
-
-
Listener 状态检查
lsnrctl status返回:
TNS-12541: TNS:no listener Linux Error: 111: Connection refused
结论:Oracle Listener 未启动。
-
启动 Listener 失败原因分析
lsnrctl start报错:
Permission denied cannot open log file .../network/log/listener.log检查监听日志目录:
ls -ld /opt/oracle/product/19c/dbhome_1/network/log发现:
- 目录属主为
zzyoradmin - Listener 实际由 oracle 用户尝试启动
- 用户不一致,导致无写权限
结论:Oracle 运行用户不统一,监听进程启动用户与 ORACLE_HOME 实际属主不一致。
- 目录属主为
-
统一运行用户并修复权限
将监听日志目录权限调整为 Oracle 实际运行用户:
chown zzyoradmin:oinstall /opt/oracle/product/19c/dbhome_1/network/log随后使用 zzyoradmin 用户 启动 Listener:
su - zzyoradmin lsnrctl startListener 成功启动,1521 端口正常监听。
-
数据库实例状态检查
select instance_name, status from v$instance;返回:
ORA-01034: ORACLE not available结论:数据库实例未启动。
最终处理步骤
-
使用 zzyoradmin 启动数据库实例
export ORACLE_SID=ORCLCDB sqlplus / as sysdba startup; -
注册服务到 Listener
alter system register; -
打开 PDB
alter pluggable database all open;
根因总结
- Oracle Listener 未启动
- 启动用户与 ORACLE_HOME 实际属主不一致
- 监听日志目录无写权限导致监听启动失败
- Oracle 数据库实例未启动
- Listener 启动后仍无法提供数据库服务
经验与规范建议
- Oracle 相关进程(Listener / DB)必须统一由同一操作系统用户管理
- ORACLE_HOME、diagnostic、datafile 目录属主应保持一致
- 启动顺序规范:
- 启动 Listener
- 启动数据库实例
- 打开 PDB
- 应用连接报错优先从数据库环境排查
结论
该问题本质是 Oracle 运行用户不统一,导致监听启动失败,同时数据库实例未启动,与应用代码无关。
浙公网安备 33010602011771号