环境:
14:56:24 sys@ORCL (^ω^) select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
oracle NET 涉及面面方方,包括服务端、客服端、防火墙等,且以OS NET为基础搭建。oracle NET能够建立客服端或应用服务器到数据库服务器的连接,并负责连接的维护和数据的传送。客户端和服务端必须使用相同的协议,其中最流行的当属TCP/IP。
1 oracle 网络体系结构
oracle的网络架构基于OSI七层模型
客户端的OCI和服务端的OPI组成了会话层,负责在客户端和服务端之间建立一个完整的sql会话,功能包括:
㈠ 解析sql,进行语法分析
㈡ 为sql申请和分配cursor
㈢ 为sql提供绑定变量
㈣ 从服务器的数据字典获取记录的元数据
㈤ 执行sql
㈥ 返回结果
㈦ 关闭cursor
TTC层对应OSI的表示层,负责客户端和服务器之间字符集和数据类型的转换。
NET8,之所以称之为8,大抵是因为独立于OSI任何一层,配置oracle网络连通能力,实际上就是配置NET8这一层,而NET8这一层包括两个部分,服务器端的监听器、客户端的TNS.
2 监听器
在服务端,oracle NET包括一个活动的进程叫监听器。监听器活着的意义,就只是传递用户的请求。监听器必须存在于服务端。是客户端和服务端的中间组件。监听器的功能只是负责建立客户端和服务端的连接,它并不承担客户端和服务端的通信。监听器启动后,会去读取监听器配置文件--listener.ora。位于$ORACLE_HOME/network/admin下。通过命令lsnrctl可进入监听器的属性配置。OS命令tnsping只能判断客户端到监听器的连接是否通畅,与服务端是否正常运行无任何瓜葛。客户进程通过读取tnsnames.ora请求和服务器建立连接,如果是一条专用服务器连接,监听器进程就会为客户端创建一个server process(通过fork()创建)。
这其中涉及三种进程:服务进程、监听进程、客户进程。工作原理如下:
① 服务器端启动监听进程,这个进程会在一个固定的IP和端口上监听用户请求
② 用户进程向指定的IP和端口发出连接请求,送达给监听进程
③ 监听进程收到用户请求后,会fork()一个服务进程
④ 监听进程把用户请求转发给服务进程,此时,监听进程的使命就此结束,不在参与后续的任何工作,回去继续监听其他用户的请求
⑤ 服务进程和用户进程建立连接后,开始处理和返回用户的请求,直到用户进程结束连接。
类比一下,oracle NET如同非诚勿扰,监听进程犹如乐嘉和孟非,服务进程和客户进程如同男方、女方,双方牵手之后的事情就不在是乐嘉和孟非的事情了。
[oracle@localhost ~]$ lsnrctl
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 11-SEP-2012 09:57:03
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace spawn
change_password quit exit
set* show*
reload:重新加载listener.ora,不需要重启监听器就使配置生效
监听器的实例状态信息:
READY:表示实例可以接受连接
BLOCKED:表示实例不能接受连接
READY/SECONDARY:表示RAC的第二个实例准备接受连接
UNKNOWN:表示监听器是静态注册的
3 静态配置和动态注册
服务端的监听器和数据库是两组独立的组件。监听进程并不绑定到某个特定的数据库。若望传递用户请求,首先必须知道如何才能找到目标数据库,这种信息的获得可以通过两种方式:静态配置和动态注册
静态配置:明确告诉监听器某个数据库的信息,监听器在启动过程中就会去加载这部分信息。这部分信息同样记录在listener.ora,其中SID_LIST_<listener_name>部分就是静态配置内容。
动态注册:只要数据库处于运行状态,PMON就会自动、定期的向监听进程注册、更新信息。DBA也可以通过:alter system register。强制PMON向监听进程注册。如果没有定义service_name,PMON会使用global db_name注册到监听进程.如果监听器具有缺省的名称、端口及协议,则无需任何特殊配置,oracle就能执行动态配置;如果监听器具有非标配置,则需要设置local_listener参数。可以通过alter system set service_names来设置一个或者多个服务名。
区别:
1)静态配置的状态是UNKNOWN,动态注册的状态是READY
2)动态注册不需要对监听器做任何配置,静态配置需要针对每个数据库做额外配置
3)动态注册,由于监听器确切地知道实例的状态,能够做到连接时故障转移,运行时去连接负载均衡。而静态配置,实例对监听器是透明的。
4 客户端的配置
客户端若想连接到数据库,需要得到两方面信息:
① 数据库所在服务器的IP和端口
② 数据库的service_name
这两部分称之“连接描述符”。
为了加强用户体验,oracle提出“连接标识符”,也叫网络服务名。在服务端配置。
无论使用哪种方式连接数据库,最终使用的都是连接描述符。但若使用连接标识符,客户端需要有一个地方来保存连接标识符和连接描述符之间的关系。
oracle提供了4种方式:
① local naming:利用tnsnames.ora完成翻译过程
② easy connect naming:客户端不需要任何配置,只有ora 10g才支持
③ external naming
④ directory naming