Oracle连接满了,无法登录数据库,如何分析连接来源?

在日常数据库运维中,我们可能会遇到 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、进程号、应用文件,可以准确定位到问题应用,建议的解决方案如下:

  1. 临时方案

    • 与应用负责人沟通 ,临时 重启或停止该 Java 应用,释放数据库连接。
  2. 长期方案

    • 排查应用代码 ,确保数据库连接池(如 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 连接超时机制 ,避免长时间空闲的连接占用资源:

      复制代码
      ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;
      ALTER PROFILE DEFAULT LIMIT IDLE_TIME 30;

      这样,空闲30分钟的连接将被自动断开


6. 总结

本文介绍了 Oracle 连接数耗尽时的排查思路,核心分析步骤如下:

  1. 检查告警日志,确认是否达到最大连接数
  2. 使用 netstat 查找主要连接来源 IP
  3. 登录对应服务器,查找建立连接的进程
  4. 分析进程对应的应用,确认是否存在连接不释放的问题
  5. 临时处理:重启应用或数据库,释放连接
  6. 长期优化:调整数据库参数,优化应用代码,配置连接池,设定连接超时

通过这些方法,可以有效排查 Oracle 连接数满的问题,并采取适当的优化措施,保障数据库稳定运行。


🚀 你是否遇到过类似的问题?欢迎在评论区讨论! 🚀

🎓 红帽、甲骨文、华为 认证资料分享

如果你希望深入学习Oracle并获得 OCM认证,欢迎获取相关学习资料。资料涵盖:

  • 考试大纲

  • 培训教材

  • 实验手册

📩 获取方式:私我即可获取学习资料!

相关推荐
2301_8213696115 分钟前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
电商API_180079052471 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
2401_832131951 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
打工的小王2 小时前
redis(四)搭建哨兵模式:一主二从三哨兵
数据库·redis·缓存
Anarkh_Lee2 小时前
【小白也能实现智能问数智能体】使用开源的universal-db-mcp在coze中实现问数 AskDB智能体
数据库·人工智能·ai·开源·ai编程
橘子133 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102163 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋3 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣503 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
shengli7223 小时前
机器学习与人工智能
jvm·数据库·python