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认证,欢迎获取相关学习资料。资料涵盖:

  • 考试大纲

  • 培训教材

  • 实验手册

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

相关推荐
朱峥嵘(朱髯)20 小时前
数据库如何根据估计 NDV,以及通过分区 NDV 推导全局 NDV
数据库·算法
7ioik20 小时前
RC和RR隔离级别下MVCC的差异?
数据库·sql·mysql
高溪流20 小时前
2.Mysql相关概念 及 数据库操作
数据库·mysql
Summer_Uncle20 小时前
【QT学习】qt项目使用MySQL数据库
数据库·qt·学习
施嘉伟20 小时前
Oracle 10046 Trace 硬核指南:SQL 慢在哪,从底层拉出来
数据库·sql·oracle
_ziva_21 小时前
MAC-SQL 多智能体协作框架解析
数据库·oracle
最贪吃的虎21 小时前
Redis其实并不是线程安全的
java·开发语言·数据库·redis·后端·缓存·lua
代码不停21 小时前
MySQL事务
android·数据库·mysql
山峰哥21 小时前
数据库工程与SQL调优实战:从原理到案例的深度解析
java·数据库·sql·oracle·性能优化·编辑器
OpsEye21 小时前
Redis 内存碎片的隐形消耗——如何用 memory purge 命令释放空间?
运维·网络·数据库·redis·缓存·内存·监控