在日常数据库运维中,我们可能会遇到 Oracle 连接数达到上限,导致无法登录数据库 的情况。本文将介绍如何分析连接来源,并提供排查思路和解决方案,帮助 DBA 快速恢复数据库的正常运行。
1. 问题现象
在生产环境中,我们收到了 数据库连接数使用率偏高的告警:
[ID:xxx][CJC测试系统:XXX][数据库] 连接数使用率偏高,the current value is 95.58% [CJC]
故障发生时间: 2025-02-28 xx:xx:xx
1.1 尝试登录数据库
尝试以 sysdba
方式登录数据库,查看资源限制:
sqlplus / as sysdba
SQL> select * from v$resource_limit;
但遇到了如下错误:
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0
进一步尝试查看数据库实例状态:
SQL> select status from v$instance;
仍然返回错误:
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0
2. 进一步分析
2.1 检查告警日志
查看 alert.log
,发现如下告警信息:
Process W004 submission failed with error = 20
ORA-00020: maximum number of processes (430) exceeded
ORA-20 errors will not be written to the alert log for the next minute.
Please look at trace files to see all the ORA-20 errors.
该错误表明 数据库的最大连接数(processes参数)已被耗尽,新连接请求无法被受理。
3. 如何查找连接来源
临时解决方案:
可以重启应用或重启数据库来释放连接,但如果不找到连接来源,问题可能会再次发生。因此,我们需要分析连接来源并采取针对性措施。
3.1 通过 netstat 查看连接
在数据库服务器上,使用 netstat
命令查找 TCP 连接信息:
netstat -ano | grep 1521 > 0228.log
more 0228.log
统计当前连接数:
cat 0228.log | wc -l
输出:
445
说明数据库当前有 445 个连接。
进一步分析特定来源 IP :
cat 0228.log | grep 192.168.0.101 | wc -l
输出:
394
可以看到,大部分数据库连接(394个)来自 192.168.0.101。
3.2 确定具体连接的应用
登录 192.168.0.101 服务器,使用 netstat
命令继续分析:
netstat -lanp | grep 1521 | more
输出示例:
tcp 0 0 192.168.0.101:**** 192.168.0.103:1521 ESTABLISHED 6666/java
tcp 0 0 192.168.0.101:**** 192.168.0.103:1521 ESTABLISHED 6666/java
tcp 0 0 192.168.0.101:**** 192.168.0.103:1521 ESTABLISHED 6666/java
...
当前发现有 283 个连接,所有连接都由 PID=6666 的 Java 进程 建立。
再确认总连接数:
netstat -lanp | grep 1521 | wc -l
输出:
283
4. 进一步分析 Java 进程
4.1 查找进程信息
ps -ef | grep 6666
输出:
tomcat 6666 1 0 Feb24 ? 00:16:38 java -jar -Xms****M -Xmx****M xxxtestxxx.jar --spring.profiles.active=xxx
4.2 查找对应的应用文件
find / -name xxxtestxxx.jar
找到对应的 Java 应用 xxxtestxxx.jar
,确认该进程是 造成大量连接不释放的根源。
5. 解决方案
通过 服务器IP、进程号、应用文件,可以准确定位到问题应用,建议的解决方案如下:
-
临时方案:
- 与应用负责人沟通,临时 重启或停止该 Java 应用,释放数据库连接。
-
长期方案:
- 排查应用代码,确保数据库连接池(如 Druid、HikariCP)正确配置,并检查是否存在 连接未释放 的问题。
- 优化数据库连接数,调整 Oracle 参数:
注意:调整alter system set processes=600 scope=spfile; alter system set sessions=900 scope=spfile;
processes
参数需要重启数据库才能生效。 - 定期监控数据库连接,设置定时任务检查活跃连接:
select machine, count(*) from v$session group by machine order by count(*) desc;
- 启用 Oracle 连接超时机制,避免长时间空闲的连接占用资源:
这样,空闲30分钟的连接将被自动断开。ALTER SYSTEM SET RESOURCE_LIMIT = TRUE; ALTER PROFILE DEFAULT LIMIT IDLE_TIME 30;
6. 总结
本文介绍了 Oracle 连接数耗尽时的排查思路,核心分析步骤如下:
- 检查告警日志,确认是否达到最大连接数。
- 使用 netstat 查找主要连接来源 IP。
- 登录对应服务器,查找建立连接的进程。
- 分析进程对应的应用,确认是否存在连接不释放的问题。
- 临时处理:重启应用或数据库,释放连接。
- 长期优化:调整数据库参数,优化应用代码,配置连接池,设定连接超时。
通过这些方法,可以有效排查 Oracle 连接数满的问题,并采取适当的优化措施,保障数据库稳定运行。
🚀 你是否遇到过类似的问题?欢迎在评论区讨论! 🚀
🎓 红帽、甲骨文、华为 认证资料分享
如果你希望深入学习Oracle并获得 OCM认证,欢迎获取相关学习资料。资料涵盖:
-
考试大纲
-
培训教材
-
实验手册
📩 获取方式:私我即可获取学习资料!