天安装Oracle11g的Windows版时,发生“TNS协议适配器错误”,我进入Windows系统的服务管理器启动“OracleOraDb11g_home1TNSListener”时,又发生了“错误3 系统找不到指定路径”。在网上查找了些资料,很多都是Oracle9i或是Oracle10g的解决办法,但是在11g中也是有帮助的,只是不同的版本之间,TNSLSNR.EXE的存放目录不同。在11g中,该文件存放在“oracle11.1.0\product\db\BIN”(部分目录名我修改过)
如果是在安装时发生这个错误,以下是我的解决办法,需要修改注册表。
一、在“开始”->“运行”中输入“regedit”,打开注册表
二、进入注册表,“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraDb11g_home1TNSListener”查看“OracleOraDb11g_home1TNSListener”值中有没有“ImagePath”键,如果没有的话,需要添加,然后给这个键赋值,这值是“J:\oracle11.1.0\product\db\BIN\TNSLSNR.EXE”(不同机器路径不同,需要注意)。保存推出注册表。
三、进入服务管理,右键点击“我的电脑”,选择“管理”进入“计算机管理”,然后点击“服务和应用程序”打开树形列表,点击“服务”。这样我们就能开到整个计算的服务,找到Oracle11g的监听服务“OracleOraDb11g_home1TNSListener”,点击启动就可以安装“Oracle Database Configuration Assistant”了。
以下是安装“Oracle Database Configuration Assistant”时Oracle11g打出的日志:
已通过 Configuration Assistant "Oracle Net Configuration Assistant" 生成输出:
Command = C:\WINDOWS\system32\cmd /c call J:\oracle11.1.0\product\db/bin/netca.bat /orahome J:\oracle11.1.0\product\db /orahnam OraDb11g_home1 /instype typical /inscomp client,oraclenet,javavm,server,ano /insprtcl tcp,nmp /cfg local /authadp NO_VALUE /nodeinfo NO_VALUE /responseFile J:\oracle11.1.0\product\db\network\install\netca_typ.rsp
正在对命令行参数进行语法分析:
参数"orahome" = J:\oracle11.1.0\product\db
参数"orahnam" = OraDb11g_home1
参数"instype" = typical
参数"inscomp" = client,oraclenet,javavm,server,ano
参数"insprtcl" = tcp,nmp
参数"cfg" = local
参数"authadp" = NO_VALUE
参数"nodeinfo" = NO_VALUE
参数"responsefile" = J:\oracle11.1.0\product\db\network\install\netca_typ.rsp
完成对命令行参数进行语法分析。
Oracle Net Services 配置:
完成概要文件配置。
监听程序的启动端口:1521
Oracle Net 监听程序启动:
正在运行监听程序控制:
J:\oracle11.1.0\product\db\bin\lsnrctl start LISTENER
监听程序控制完成。
启动监听程序失败。监听程序可能已经在运行。
监听程序配置完成。
成功完成 Oracle Net Services 配置。退出代码是0
Configuration Assistant "Oracle Net Configuration Assistant" 成功
-----------------------------------------------------------------------------
已通过 Configuration Assistant "Oracle Database Configuration Assistant" 生成输出:
Command = oracle.assistants.server.DbcaCfgPlugIn C:\WINDOWS\system32\cmd /c call J:\oracle11.1.0\product\db/bin/dbca.bat -progress_only -createDatabase -templateName General_Purpose.dbc -sid orcl -gdbName orcl -emConfiguration LOCAL -datafileJarLocation J:\oracle11.1.0\product\db\assistants\dbca\templates -datafileDestination J:\oracle11.1.0\oradata -responseFile NO_VALUE -characterset ZHS16GBK -obfuscatedPasswords false -sampleSchema true -recoveryAreaDestination NO_VALUE -totalMemory 614 -automaticMemoryManagement true -maskPasswords false -sysPassword SSYSPASS−systemPassword{S_SYSTEMPASS} -dbsnmpPassword SDBSNMPPASS−sysmanPassword{S_SYSMANPASS} SSYSASMPASS{S_HOSTUSERPASS}
Configuration Assistant "Oracle Database Configuration Assistant" 失败
-----------------------------------------------------------------------------
"J:\oracle11.1.0\product\db\cfgtoollogs\configToolFailedCommands" 脚本包含所有失败的, 跳过的或取消的命令。可使用此文件在 OUI 外运行这些 Configuration Assistant。请注意, 执行此脚本前, 您可能需要用口令 (如果有) 来更新此脚本。-----------------------------------------------------------------------------
第二种解决方案:
我们知道oracle客户端连接时涉及用到的几个配置文件有:sqlnet.ora、tnsnames.ora、listener.ora。其中sqlnet.ora和tnsnames.ora是在客户端的配置文件,listener.ora则是在服务器端的监听配置文件。
想要顺利的连接上服务器端,首先要确保两者之间的网络通畅。其二在服务器上配置好监听程序。其三是客户端配置好相应的tnsnames.ora。
在配置服务器端监听程序时要注意几点:
1、在服务器上的/etc/hosts文件中需要有127.0.0.1 localhost 这一条.默认情况下是有的。若没有则在启动监听器是会报TNS-12537:TNS:connection closed的错误.同时最好添加上你的服务器IP 主机名。
2、配置监听器时可以使用netca或者直接写配置文件listener.ora也行
# 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.56.120)(PORT = 1521))
)
)
其中的HOST最好使用IP,主机名可能会发生改变——影响较多。
客户端的配置主要的是tnsnames.ora这个文件
CENTOS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.120)(PORT = 1521))
)
(CONNECT_DATA =
(SID = centos)
(SERVER = DEDICATED)
)
)
其实也没什么东西
对于sqlnet.ora这个文件中的NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)这个参数,其中EZCONNECT是oracle10G新加的,好像是用来快速连接的。使用主机名Easy的连接掉服务器。不用TNSNAMES的方式连接。
所有的设置都弄好了,如果你还是发现在客户端(Windows)不能连接到服务器端(Linux),查看服务器上的防火墙对oracle的1521端口是否开放。不是很重要的练习用的机子可以直接将防火墙关闭。
1) 永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
2) 即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
最后在说下在排错时用到的一些命令:lsnrctl (start、stop、status)、tnsping (IP/主机名)、netstat -anp (查看端口)、telnet等。