oracle NET学习(1):NET-8和监听器行为分析

长平狐 发布于 2012/09/19 13:56
阅读 167
收藏 0

环境:

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


原文链接:http://blog.csdn.net/linwaterbin/article/details/7967244
加载中
返回顶部
顶部