[Ora]TNS-12537报错解决方法

本文记录了一次解决Oracle数据库连接错误TNS-12537的经历,详细介绍了问题出现的原因及解决步骤。通过调整服务器的主机名设置,最终成功解决了客户端无法连接数据库的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天公司因为服务器迁移,需要将数据库暂时关闭,等迁移完后,启动服务器,打开数据库正常,但是使用客户端连接数据库时,

总是提示TNS-12537:连接关闭,首先想到的是使用tnsping,测试一下数据库的连通状况,结果连不上,

首先想到的是去服务器查一下log日志,结果如下

***********************************************************************
Fatal NI connect error 12537, connecting to:
 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle)(PORT=1521))(CONNECT_DATA=(SID=dd)(CID=(PROGRAM=emagent)(HOST=oracle)(USER=oracle))))


  VERSION INFORMATION:
TNS for Linux: Version 11.2.0.4.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
  Time: 28-NOV-2015 10:55:51
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12537
    TNS-12537: TNS:connection closed
    ns secondary err code: 12560
    nt main err code: 507
    TNS-00507: Connection closed
    nt secondary err code: 0

网上大概搜索了下,发现大多数的影响因素都被排除,但是问题都没解决。

无意中检查了一下hostname,发现hostname被修改了,

发现问题后,解决起来就很简单了,直接hostname oracle ,然后再/etc/sysconfig/network中修改主机名为oracle即可,重新启动oracle和监听以后,一切正常。

造成的原因很简单因为在厂商安装服务器系统时,系统的主机名为localhost.domain,而安装数据库时直接hostname oracle修改,并没有在/etc/sysconfig/network中修改,从而导致服务器重启后,服务器的主机名直接被还原。


总结:错误解决很简单,但是造成原因很难捕捉到,当然TNS-12537错误还是有很多其他原因,这里只提供一种解决的场景,仅供参考。


### 解决 Oracle ORA-12514 报错 当遇到 `ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor` 错误时,这通常意味着客户端尝试连接到的服务名称未被监听器识别。以下是几种可能的原因及解决方案: #### 验证服务名配置 确保在 tnsnames.ora 文件中的服务名和服务注册信息匹配。如果使用的是 Easy Connect 方法,则需确认主机名、端口以及服务名都正确无误。 ```bash # 检查tnsnames.ora文件路径下的内容 $ORACLE_HOME/network/admin/tnsnames.ora ``` #### 查看监听状态并验证已知服务 利用 lsnrctl 工具查看当前监听的状态及其知道哪些服务。这样可以帮助判断指定的服务是否已被监听器知晓。 ```bash lsnrctl status ``` 该命令会显示所有由监听进程管理的服务列表[^1]。 #### 修改 listener.ora 或者重新启动监听器 有时修改后的配置不会立即生效,因此建议重启监听器使更改生效: ```bash lsnrctl stop lsnrctl start ``` 另外,在某些情况下调整 `listener.ora` 中静态侦听设置也可能解决问题,特别是对于那些不自动向动态注册机制报告自己的实例来说更为重要[^3]。 #### 使用正确的连接字符串参数 确保应用程序使用的 JDBC URL 或其他形式的连接串里包含了适当的服务名而非 SID 。例如: ```java // 正确的方式应该是使用service name 而不是sid String url = "jdbc:oracle:thin:@hostname:port/service_name"; ``` #### 数据库实例状态检查 最后但同样重要的一步是要保证目标数据库实例正在运行并且能够接受新的连接请求。可以通过查询视图 V$INSTANCE 来获取有关实例的信息。 ```sql SELECT instance_name, status FROM v$instance; ``` 以上措施应该能有效处理大部分因服务命名错误而导致的 ORA-12514 问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值