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

  • 考试大纲

  • 培训教材

  • 实验手册

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

相关推荐
小二·5 小时前
MyBatis基础入门《十六》企业级插件实战:基于 MyBatis Interceptor 实现 SQL 审计、慢查询监控与数据脱敏
数据库·sql·mybatis
bing.shao5 小时前
Golang WaitGroup 踩坑
开发语言·数据库·golang
专注VB编程开发20年5 小时前
C#内存加载dll和EXE是不是差不多,主要是EXE有入口点
数据库·windows·microsoft·c#
小二·5 小时前
MyBatis基础入门《十二》批量操作优化:高效插入/更新万级数据,告别慢 SQL!
数据库·sql·mybatis
何中应5 小时前
【面试题-6】MySQL
数据库·后端·mysql·面试题
路遥_135 小时前
银河麒麟 V10 安装部署瀚高数据库 HighGoDB 4.5 全流程(统信UOS Server 20同理)
数据库
TDengine (老段)5 小时前
从关系型数据库到时序数据库的思维转变
大数据·数据库·mysql·时序数据库·tdengine·涛思数据·非关系型数据库
老兵发新帖5 小时前
ubuntu网络管理功能分析
数据库·ubuntu·php
2301_768350235 小时前
MySQL服务配置与管理
数据库·mysql
+VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·旅游