pugna
全部博文(171)
分类: Oracle
2013-03-23 17:06:06
Oracle客户端连接Oracle实例的步骤及常见错误
Oracle客户端连接Oracle实例的步骤(以PL/SQL Developer为例):
应用程序(PL/SQL Developer)提供用户名、密码、登陆角色和网络服务名(即netca中的服务命名,也叫连接字符串)进行连接。
第一步,Oracle客户端根据sqlnet.ora中NAMES.DIRECTORY_PATH的配置,决定使用哪几个文件对 网络服务名 进行解析。默认的配置是,首先通过tnsnames.ora来解析 网络服务名 。
第二步,Oracle客户端根据tnsnames.ora解析出 网络服务名 所代表的 连接所使用的协议(一般是TCP/IP),Oracle实例所在的IP、连接端口(一般默认为1521) 及 监听服务名称。
第三步,Oracle客户端(我不清楚这一步是由Oracle客户端还是由应用程序发起连接,这里暂且当时是Oracle客户端吧)根据对应的协议,向Oracle实例所在的IP的连接端口发起连接,并请求 刚才通过tnsnames.ora解析出的 监听服务 。
第四步,Oracle服务端的监听程序Listener,与Oracle客户端建立网络连接后,在已注册服务列表中查找Oracle客户端所请求的服务。若存在,则监听程序Listener将此服务对应的Oracle实例的相关信息返回给Oracle客户端,再由Oracle客户端根据返回的信息直接与Oracle实例直接建立连接。至此,连接完成。
注:本文中的监听服务指的是Oracle监听程序中所监听的服务名,而非操作系统级别的服务。
在排查Oracle连接问题时,经常要使用tnsping工具,tnsping在操作系统shell下执行。
tnsping 网络服务名
得到的是 与 Oracle实例的监听程序所建立网络连接的结果。它并不会查询 监听程序上 是否存在所请求的 监听服务。
根据以上的连接步骤的顺序,连接时的错误主要有以下几种:
一、TNS-03505
若tnsping 网络服务名 的结果报以下错误:
***********************************************************
TNS-03505: 无法解析名称
***********************************************************
则表示Oracle客户端无法根据sqlnet.ora和tnsnames.ora解析 网络服务名 。
二、ORA-12541
若tnsping 网络服务名 的结果报以下错误:
***********************************************************
ORA-12541: TNS: 无监听程序
在输入的字段中可能有错误,
或者服务器连接未就绪。
***********************************************************
则表示Oracle客户端无法与解析 网络服务名 得到的协议、IP、端口建立连接。即Oracle客户端与Oracle服务端的监听程序连接失败了。
可能的原因为:
1.Oracle客户端通过sqlnet.ora和tnsnames.ora解析得到的协议、IP、端口与通信协议、Oracle实例所在的IP、监听程序使用的监听端口不一致。
2.Oracle服务端未启动监听程序。
三、ORA-12514
若tnsping 网络服务名 的结果正常,但是通过Oracle客户端(或应用程序)连接所请求的服务报以下错误:
***********************************************************
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
在输入的字段中可能有错误,
或者服务器连接未就绪。
***********************************************************
则表示Oracle客户端与Oracle服务端的监听程序Listener正常建立了网络连接,但是Oracle服务端的监听程序Listener无法在已注册列表中找到Oracle客户端所请求的服务。
四、ORA-01034 和 ORA-27101
若tnsping 网络服务名 的结果正常,但是通过Oracle客户端(或应用程序)连接所请求的服务报以下错误:
***********************************************************
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
在输入的字段中可能有错误,
或者服务器连接未就绪。
***********************************************************
则表示Oracle服务端的监听程序Listener已经注册了所请求的服务,但是连接该服务所对应的实例时,发现此实例不可用(如实例未启动)
一般出现这种情况,是因为Oracle服务端的监听程序Listener使用了静态服务注册,而此时Oracle实例并未启动。
2013-03-19 15:23