参考:
http://blog.163.com/dazuiba_008/blog/static/363349812011718113524849/
http://blog.itpub.net/25264937/viewspace-689470
http://blog.csdn.net/tianlesoftware/article/details/5543166
http://blog.csdn.net/selfsupport/article/details/5726303
http://blog.csdn.net/chunhua_love/article/details/13626361
以下内容是我个人关于listener总结:
- 一个DB可以有不止一个listener, 一个listener上可以有多个service, 一个listener可以有多个DB注册;
- listener.ora、 tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,其中listener.ora是和数据库服务器端相关,而tnsnames.ora和sqlnet.ora这2个文件不仅仅关系到服务器端,主要的还是和客户端关系紧密。
- sqlnet.ora(客户及服务器端) --作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串;
- Tnsnames.ora(客户及服务器端) --这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似 NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。
- listener.ora(服务器端) --listener监听器进程的配置文件。接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。
- 常用工具: dbca, netca, netmgr, lsnrctl, svrctl, tnsping, sqlplus
- lsnrctl status查看服务器端listener进程的状态
- tnsping 查看客户端sqlnet.ora和tnsname.ora文件的配置正确与否,及对应的服务器的listener进程的状态。
- SQL>;show sga 查看instance是否已经启动
SQL>; select open_mode from v$database; 查看数据库是打开还是mount状态。
- listener.ora、 tnsnames.ora和sqlnet.ora默认放在$ORACLE_HOME/network/admin/;如果放在其它位置,需要设置环境变量TNS_ADMIN。
- DB认证方式有三种:OS认证、口令文件认证和数据库认证。
下面是我个人根据几篇blog思考后画的Oracle监听服务架构图。
换个角度理解:
orcl是我们连接远端数据库用到的服务命名,但是最终必须转化为host:port:service_name这样的 连接字串,而这个转化可以理解为是翻译的过程,而要想翻译成功,则必须选择好翻译方法,那么sqlnet.ora就是我们用来选择翻译方法的,其中的 NAMES.DIRECTORY_PATH= (TNSNAMES) 就是我们选择的命名解析方法; tnsnames.ora是翻译方法中的一种——本地命名解析方法的配置文件,就好像我们选择了查字典方法,这个文件就是我们的字典一样里面存放着所有服务命名对应的连接字串;至于listener.ora则是负责接受我们请求的负责人——连接地址配置文件,里面包括了连接负责人的连接地址,也放着经过他允许可以连接的数据库信息。这样就构成了Oracle的网络架构。
Listener问题诊断步骤:
- 在client上检查sqlnet.ora文件中NAMES.DIRECTORY_PATH的值中是否包含 EZCONNECT; 没有就加上(以下将以EZCONNECT方式连接);
- 在client上使用命令”tnsping scl58192:1521/mytest”或”sqplus sys/welcome1@scl58192:1521/mytest as sysdba”进行测试;
- 如果没有问题, 检查client上tnsnames.ora连接字符串是否正确;
- 如果出现ORA-12537: TNS:connection closed (静态注册)
a) 检查DB是否正常启动, 并且为open状态;
b) 如果DB正常启动, 检查listener.ora中SID_NAME和ORACLE_HOME值是否正确; - 如果出现ORA-12541: TNS:no listener, 用"netstat -anp|grep 1521"检查listener进程是否启动;
- 如果出现ORA-12514: TNS:listener does not currently know of service requested in connect descriptor, 使用命令”lsnrctl status”查看service列表;
a) 如果service名称不一致, 比如缺少域名或大小写, 请重做step 2;
b) 如果出现The listener supports no services (动态注册), 在server上执行
sqlplus / as sysdba
SQL> alter system register;
再执行lsnrctl status查看service;
c) 如果还是没有service, 检查local_listener是否为空;
sqlplus / as sysdba
SQL> show parameter service_names (如果为空, 再查instance_name或db_name)
SQL> show parameter local_listener
d) 如果local_listener为空, 表明DB使用缺省listener, 用命令"netstat -anp|grep 1521"检查1521端口的进程;
e) 如果local_listener不为空,
i. 如果local_listener=’mylsrn’(网络服务名), 在sever上检查tnsnames.ora中是否配置mylsrn; 如果已配置, 用命令"netstat -anp|grep <port>"检查对应端口的listener进程;
ii. 如果local_listener=‘(ADDRESS = (PROTOCOL = TCP)(HOST =)(PORT = 1234))’, 用命令"netstat -anp|grep 1234"检查对应1234端口的进程;
格式一:Oracle JDBC Thin using a ServiceName:
jdbc:oracle:thin:@<host>:<port>/<service_name>
Example: jdbc:oracle:thin:@192.168.2.1:1521/XE
格式二:Oracle JDBC Thin using an SID:
jdbc:oracle:thin:@<host>:<port>:<SID>
Example: jdbc:oracle:thin:@192.168.2.1:1521:X01A
格式三:Oracle JDBC Thin using a TNSName:
jdbc:oracle:thin:@<TNSName>
Example: jdbc:oracle:thin:@GL