当前位置:首页 > 问答 > 正文

Oracle数据库 连接故障 ORA-12564:TNS:connection refused 报错原因分析与远程修复方法

Oracle数据库连接故障:ORA-12564报错深度解析与远程修复指南

最新动态(2025年8月):近期Oracle官方发布补丁集Patch 35681234,部分用户反馈该补丁可能引发TNS服务间歇性拒绝连接问题,若您的环境在更新后出现ORA-12564错误,可暂时回退补丁或参考下文"服务冲突排查"章节处理。


错误现象:当连接变成"单方面拒绝"

当你信心满满地输入sqlplus username/password@orcl,却看到这样的提示:

ORA-12564: TNS:connection refused  

这感觉就像敲门时发现主人明明在家,却故意不给你开门,别急,这个问题90%的情况都能远程解决。


为什么数据库会"拒绝"你?

数据库服务根本没启动

  • 典型场景:服务器重启后监听程序未自动运行
  • 自查命令(Linux/Unix):
    ps -ef | grep tns  # 检查监听进程是否存在  
    lsnrctl status     # 查看监听状态  

监听器配置"迷路"了

  • 监听配置文件listener.ora可能出现:
    • 错误的IP地址(比如配置了内网IP但远程连接使用公网IP)
    • 端口被修改(默认1521被改为其他端口但连接串未同步更新)

防火墙的"隐形墙"

  • 云服务器安全组未放行Oracle端口
  • 本地防火墙拦截出站连接(常见于Windows客户端)

网络层面的"断点"

  • 路由器/交换机过滤了数据库端口
  • VPN隧道不稳定(尤其跨国连接时)

远程修复七步法

▶ 第一步:快速确认服务状态

在数据库服务器执行:

Oracle数据库 连接故障 ORA-12564:TNS:connection refused 报错原因分析与远程修复方法

sqlplus / as sysdba  
SQL> select status from v$instance;  -- 确认数据库状态  
SQL> host lsnrctl start              -- 如果监听未启动  

▶ 第二步:监听配置文件检查

定位$ORACLE_HOME/network/admin/listener.ora,重点查看:

LISTENER =  
  (DESCRIPTION =  
    (ADDRESS = (PROTOCOL = TCP)(HOST = 实际IP或主机名)(PORT = 1521))  
  )  

避坑提示:云环境避免使用localhost0.0.1

▶ 第三步:网络连通性测试

从客户端执行:

telnet 数据库IP 1521  # 如果无响应,说明网络层有问题  
nc -zv 数据库IP 1521  # Linux替代方案  

▶ 第四步:防火墙双端检查

  • 服务器端(Linux示例):
    firewall-cmd --list-ports | grep 1521  # CentOS/RHEL  
    ufw status | grep 1521                # Ubuntu  
  • 客户端(Windows):
    检查Windows Defender防火墙出站规则是否允许SQL*Plus

▶ 第五步:TNS连接串验证

确保连接字符串与服务器配置匹配:

Oracle数据库 连接故障 ORA-12564:TNS:connection refused 报错原因分析与远程修复方法

# tnsnames.ora正确示例  
ORCL_REMOTE =  
  (DESCRIPTION =  
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))  
    (CONNECT_DATA =  
      (SERVER = DEDICATED)  
      (SERVICE_NAME = ORCL)  
    )  
  )  

▶ 第六步:日志分析黄金组合

  • 监听日志
    tail -100f $ORACLE_HOME/network/log/listener.log  
  • 数据库告警日志
    SQL> show parameter background_dump_dest;  

▶ 第七步:应急连接方案

如果急需数据且无法立即修复:

  1. 通过SSH隧道端口转发
    ssh -L 1522:localhost:1521 oracle_user@数据库IP  
  2. 临时改用JDBC直连模式(需配置TNS_ADMIN环境变量)

预防性维护建议

  1. 监听器健康监控脚本(示例):

    #!/bin/bash  
    if ! lsnrctl status | grep -q "STATUS"; then  
      echo "$(date) 监听器异常!" | mail -s "Oracle告警" admin@example.com  
    fi  
  2. 云环境特别提示

    • AWS/Azure需检查安全组和NACL规则
    • 阿里云需注意经典网络/专有网络区别
  3. 连接池优化参数

    Oracle数据库 连接故障 ORA-12564:TNS:connection refused 报错原因分析与远程修复方法

    ALTER SYSTEM SET processes=300 SCOPE=SPFILE;  
    ALTER SYSTEM SET sessions=335 SCOPE=SPFILE;  

遇到顽固性ORA-12564时,记住这个诊断链条:服务状态 → 网络可达 → 配置一致 → 日志线索,按照这个顺序排查,大多数连接拒绝问题都能迎刃而解。

发表评论