TNS-12560: TNS:协议适配器错误终极配置

本文详细介绍如何配置Oracle数据库的网络环境,包括虚拟机IP设置、防火墙配置、服务器端监听配置及客户端连接配置。

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

 

我们知道oracle客户端连接时涉及用到的几个配置文件有:sqlnet.ora、tnsnames.ora、listener.ora。其中sqlnet.ora和tnsnames.ora是在客户端的配置文件,listener.ora则是在服务器端的监听配置文件。

而在最新的oracle版本中,已经将sqlnet.ora文件放到了,同一级目录的samples下,可见sqlnet.ora的用途会逐渐减弱。

其实很多文章都写到要配置这个配置那个,但是要换个角度看问题,首先从大的方面入手:

配置你的虚拟机的ip:

设置RedHat Linux下的IP时,要和本地Windown操作系统的物理网卡或者VMware虚拟机2块虚拟网卡中的一块在同一个网段,这样在本地的Windows操作系统就能telnet到虚拟机上的RedHat Linux系统去了。例如:如果RedHat Linux下的IP和本地Windown操作系统的物理网卡在同一个网段,那么RedHat Linux的Network connection就用Bridged:Connected directly to the physical network;如果RedHat Linux下的IP和VMware虚拟机2块虚拟网卡中的一块在同一个网段(这里用虚拟网卡1),那么RedHat Linux的Network connection就用Custom:Specipic virtual network,并且选择 VMware1(host only)。

如:我通过ipconfig看的自己的ip为192.168.88.144,我想使用host only模式,我就开始下面的操作

通过网上邻居->属性->VMware Network Adapter VMnet8->属性

设置(tcp/ip)将其静态ip设置为:192.168.174.243

同样的方法将VMware Network Adapter VMnet1的静态ip设置为192.168.174.242

然后设置linux主机的ip以及host only模式,在Vmware中通过菜单VM->settings->network Adapter设置为Custom:Specipic virtual network,并且选择 VMware1(host only)。

然后开始设置linux的静态ip。adminstrator->network来打开设置,然后设置在同一个网段。

设置完之后最好通过Activate激活,并在root下通过命令重启network

>service network restart

然后呢,还是不要着急。。。。

干什么呢,防火墙!!!windows防火墙关闭很简单这里就不说了,说说关闭自己的linux防火墙,selinux

在root用户通过命令

>setup

然后选择firewall configuration,通过空格键了选择,将防火墙关闭

下面开始配置监听

在配置服务器端监听程序时要注意几点:

//可以略过这一步 :1、在服务器上的/etc/hosts文件中需要有127.0.0.1  localhost 这一条.默认情况下是有的。若没有则在启动监听器是会报TNS-12537:TNS:connection closed的错误.同时最好添加上你的服务器IP  主机名。

2、配置监听器时可以使用netca或者直接写配置文件listener.ora也行

   netca方式:在root用户下用命令>netca即可,用这种方式快速方便(推荐),但后一种能 提升能力

   配置文件方式:配置文件在$ORACLE_HOME/network/admin下

# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.174.244)(PORT = 1521))
)
)

其中的HOST最好使用IP,主机名可能会发生改变——影响较多。

  客户端的配置主要的是tnsnames.ora这个文件

SID名称 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.174.244)(PORT = 1521))
)
(CONNECT_DATA =
(SID = SID名称)
(SERVER = DEDICATED)
)
)

在这些配置好之后呢,可以再linux内部看看自己能否监听自己,如果不可以可以chage login,如果再不行呢,就用下列操作

这样做是首先启动自己的数据库,然后启动数据库中自己配置好的监听,这样在用net常识看看linux内部是否能够监听的到,net是否配置正确。

下面就通过windows下的客户端的net cofiguration assitant 来配置自己linux下的数据监听就可以了。

最后在说下在排错时用到的一些命令:lsnrctl (start、stop、status)、tnsping (IP/主机名)、netstat -anp (查看端口)、telnet等。

更多信息请查看 java进阶网 http://www.javady.com

TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序 文章转自:http://www.luocs.com/archives/464.html 此文版权归作者 – yaogang所有,转载请注明yaogang©www.luocs.com。 Luocs说:这是我一个朋友的一个监听器问题解决案例,这是昨天发生的事情,我一直跟朋友一起Troubleshooting,折腾了半天最后是BUG所致。再次汗颜,Windows平台惹不起啊!好,那么下面开始分享我朋友的案例! 环境描述: OS : Windows Server 2008 64Bit (做了HA) DB : 11.1.0.7.0 排错过程: 前天应用不能访问数据库了 (后台应用能访问数据库),故障发生。 马上登录到服务器里查看监听状态,发现有TNS-12541 ,TNS-12560错误 Luocs补充:我跟朋友要了错误代码,但他没有保存,就直接贴图。 从计算器的管理 –> 服务选项 –> 检查oracle 监听服务程序,发现该服务已经停止。 手动把监听服务启动,这时候服务状态上显示为已启动,但在CMD窗口执行lsnrctl status的时候依然返回错误信息: C:\>lsnrctl status LSNRCTL for 64-bit Windows: Version 11.1.0.7.0 - Production on 12-11月-2012 18:1 8:32 Copyright (c) 1991, 2008, Oracle. All rights reserved. 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.203.218)(PORT=1521))) TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序 64-bit Windows Error: 61: Unknown error 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) 过段时间回显非常慢。 然后我检查了下告警日志,大量的ora错误 Fatal NI connect error 12170. VERSION INFORMATION: TNS for 64-bit Windows: Version 11.1.0.7.0 - Production Oracle Bequeath NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production Windows NT TCP/IP NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production Time: 12-11月-2012 15:23:33 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS: 操作超时 ns secondary err code: 12560 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: ORA-609 : opiodr aborting process unknown ospid (4116_6104) 这时候朋友怀疑是不是监听器配置问题,就把原先的监听器删除重建了下,问题依然。 网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下: 1、在 sqlnet.ora文件中 增加如下行: DIAG_ADR_ENABLED = OFF 2、在listener.ora文件中增加如下行: DIAG_ADR_ENABLED_ = OFF 如何监听是listener时,则前面的名称为:DIAG_ADR_ENABLED_LISTENER = OFF 3、重新启动windows服务管理中的监听程序.先停止,然后再重新启动. 4、检查结果.发现可以了,返回的值在10毫秒.有时为0毫秒.成功!! 但这并不是问题发生原因,在继续排查过程中偶然发现监听日志大小居然为4G。然后把这现象告诉了Luocs。 过了一会儿,Luocs回应是Oracle一个BUG,BUG号为9879101 : THE CONNECT THROUGH LISTENER WAS SLOW WHEN LISTNER LOG GROWED 4GB。 Luocs还提供了MOS上一篇文章,ID 1319797.1 : WINDOWS: Listener Hangs & Lsnrctl Commands Are Slow or Hang,里面给出了解决方法: You can solve this problem by deleting the large listener in $ORACLE_BASE\diag\tnslsnr\\listener\trace\.log 1) Stop the listener process using the command line or Control Panel Service. 2) Delete the log file(s) that are at or approaching the 4G size limit at this location: $ORACLE_BASE\diag\tnslsnr\\listener\trace\.log 3) Issue any lsnrctl command and you will see a new listener.log in its place under: $ORACLE_BASE\diag\tnslsnr\\listener\trace\ Since ADR Diagnostics are enabled for this listener these steps cannot be done dynamically using the lsnrctl utility. e.g. LSNRCTL>set log_file mylog Will yield: TNS-01251: Cannot set trace/log directory under ADR. However, it is possible to disable the flat file listener logging using the following commands: LSNRCTL>set current_listener LSNRCTL>set log_status OFF LSNRCTL>save_config 我就按照以上说明如下进行: 1)LSNRCTL进入交互模式 2)执行set current_listener LISTENER 3)set log_status off 4)stop 停止监听器 5)手工删除ADR指定的监听日志路径下的listener.log文件 6)start重启监听器 7)status查看状态 到此问题解决。
<think>我们有两个主要问题需要解决:1.ORA-28040:Nomatchingauthenticationprotocol(身份验证协议不匹配)2.网络适配器无法建立连接(可能包括驱动安装问题)根据引用[2]和引用[3],ORA-28040错误是由于Oracle12c及以上版本(包括19c)的SQLNET.ALLOWED_LOGON_VERSION参数默认设置为11,这要求使用较新版本的客户端驱动。而使用旧版本的JDBC驱动(如ojdbc6.jar)连接时就会报此错误。而“网络适配器无法建立连接”通常与网络配置、监听器状态、连接参数或驱动有关。因此,我们分两部分解决:第一部分:解决ORA-28040错误方法1(推荐):升级JDBC驱动-使用与数据库版本匹配的驱动,如Oracle19c应使用ojdbc8.jar(版本12.2以上)-将ojdbc8.jar放入Kettle的lib目录,并移除旧版本驱动(如ojdbc6.jar)方法2:修改数据库服务器配置(如果无法升级驱动)-在数据库服务器的sqlnet.ora文件中添加:SQLNET.ALLOWED_LOGON_VERSION=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8SQLNET.ALLOWED_LOGON_VERSION_SERVER=8-重启数据库监听器(lsnrctlreload)和数据库实例。注意:方法2会降低安全性,仅作为临时解决方案。第二部分:解决网络适配器无法建立连接1.检查网络连通性-使用telnet命令测试数据库服务器的1521端口是否可达:telnet<数据库IP>1521-如果不通,检查防火墙设置(数据库服务器和客户端两端)以及网络路由。2.验证监听器状态-在数据库服务器上执行:lsnrctlstatus-确保监听器正在运行,并且服务名(SERVICE_NAME)正确。3.检查连接参数-在Kettle中,确保使用正确的连接格式:jdbc:oracle:thin:@//<host>:<port>/<service_name>-注意:Oracle12c及以上版本使用服务名(SERVICE_NAME)而不是SID。4.驱动安装验证-确保Kettle的lib目录下有正确的ojdbc8.jar,并且没有其他旧版本驱动(避免冲突)。-重启Kettle。5.时区问题(可选)-如果遇到时区错误,可以在连接URL中添加参数:?oracle.jdbc.timezoneAsRegion=false或者?serverTimezone=Asia/Shanghai总结步骤:1.升级驱动到ojdbc8.jar(解决ORA-28040)2.检查网络和监听器(解决网络适配器错误)3.确认连接参数(特别是服务名)如果按照以上步骤仍然无法解决,请提供以下信息以便进一步排查:-数据库版本(如Oracle19c)-Kettle版本-使用的JDBC驱动文件名及版本-连接字符串-错误日志全文最后,根据引用[4]的提示,如果使用低版本客户端,也可能需要修改客户端的sqlnet.ora(但推荐升级驱动)。注意:在Oracle19c中,默认使用服务名(SERVICE_NAME),在创建连接时不要使用SID。以下是一个配置示例:主机名:192.168.1.100端口:1521数据库名称(服务名):ORCLPDB1(注意:不是SID)用户名/密码:your_username/your_password在Kettle的“Oracle”连接类型中,确保选择“Native(JDBC)”并填写正确。如果使用TNS连接方式,则需要在tnsnames.ora中配置,并在连接字符串中使用TNS别名。但通常推荐使用简单连接字符串(如上所示)。</think>### 解决 Oracle ORA-28040 和网络适配器连接问题的完整指南 #### 一、ORA-28040 错误解决方案(身份验证协议不匹配) **根本原因**:Oracle 12c+ 默认要求高版本认证协议,与旧驱动不兼容(引用[2][3]) **解决步骤**: 1. **升级 JDBC 驱动(推荐方案)** - 下载最新 **ojdbc8.jar**(Oracle 19c 官方驱动) - 替换 Kettle/lib 目录中的旧驱动(如 ojdbc6.jar) - 重启 Kettle 2. **修改数据库配置(临时方案)** ```ini # 在数据库服务器的 $ORACLE_HOME/network/admin/sqlnet.ora 中添加: SQLNET.ALLOWED_LOGON_VERSION=8 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 ``` - 重启数据库监听器: ```bash lsnrctl stop lsnrctl start ``` #### 二、网络适配器无法建立连接的解决方案 **诊断流程图**: ```mermaid graph TD A[连接失败] --> B{端口是否可达?} B -->|是| C[检查监听器状态] B -->|否| D[开放防火墙1521端口] C --> E[验证服务名配置] E --> F[检查URL格式] ``` **关键操作**: 1. **防火墙配置** ```bash # Windows netsh advfirewall firewall add rule name="OraclePort" dir=in action=allow protocol=TCP localport=1521 # Linux sudo firewall-cmd --permanent --add-port=1521/tcp sudo firewall-cmd --reload ``` 2. **监听器状态检查** ```bash lsnrctl status # 确认监听器运行 ``` 3. **连接字符串验证** ```java // 正确格式(使用SERVICE_NAME) jdbc:oracle:thin:@//192.168.48.205:1521/ORCL // 错误示例(使用SID已废弃) jdbc:oracle:thin:@192.168.48.205:1521:ORCL ``` #### 三、驱动安装最佳实践 1. **必需驱动文件**: - 主驱动:`ojdbc8.jar`(Oracle 19c) - 字符集支持:`orai18n.jar`(防中文乱码) - 高级特性:`ucp.jar`(连接池) 2. **驱动部署位置**: ``` Kettle安装目录/ └── lib/ ├── ojdbc8.jar ├── orai18n.jar └── ucp.jar ``` 3. **版本兼容检查**: ```bash java -jar ojdbc8.jar # 查看驱动版本信息 ``` #### 四、终极验证流程 1. **本地连接测试**: ```bash sqlplus username/password@//host:1521/service_name ``` 2. **TNS 连通性测试**: ```bash tnsping SERVICE_NAME # 引用[3]示例中的服务名 ``` 3. **Kettle 连接参数配置**: ```properties 连接类型:Native (JDBC) 主机名:192.168.48.205 # 引用[3]示例IP 端口:1521 数据库名称:ORCL # 引用[3]示例服务名 额外选项:oracle.jdbc.timezoneAsRegion=false ``` > **关键提示**:同时存在 ORA-28040 和网络错误时,**先解决网络连通性问题**(telnet 测试端口),再处理认证协议问题[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值