Oracle网络连接和配置

每当我们发出如下命令:
    C>sqlplus username/password@service_name
    或者:
    SQL>connnect username/password@service_name;
    这背后包含了Oracle的网络和连接配置的有关知识。这些内容是Oracle DBA需掌握的最基本知识。尤其是在《Oracle备份·恢复·高可用性》的某些讨论主题中,比如 Dataguard环境的建立,高级复制或者RAC的实施,都会有明确涉及这方面的主题。基于这样应用的重要性,以及知识的基础性,也考虑到朋友们常遇到和询问这方面的问题,在我的《Oracle备份·恢复·高可用性》的在线教程体系中,我把《Oracle的网络和连接配置》和《Oracle参数和参数文件》单列出来做成《Oracle备份·恢复·高可用性》预备性的基础知识。放在《前言》的这一部分结构中。

在这里,我们将详细的,全面的讨论有关Oracle的网络和连接配置知识。主要的讨论的话题涉及到:
    1。理解Oracle的网络连接和侦听服务的概念
    2。理解Tnsnames.ora和Listener.ora文件的作用
    3。和现实世界的从事摄影服务的SID一家人做对比
    4。了解lsnrctl管理小程序
    5。连接到其他数据库服务器上的实例
    6。利用windows认证连接到Oracle
        6.1 具有Oracle管理权限的操作系统身份验证
        6.2 具有Oracle管理权限,利用密码文件进行身份验证
        6.3 不具有Oracle管理权限的操作系统身份验证
    7。SQLNET.ora文件的作用:“高级的”控制Client连接行为
    8。总结和提高
         8.1 重要概念和基本原则
         8.2 ping 和tnsping 的作用
         8.3 一个Data Guard情况下的案例

在这里,我针对一些主要的问题,最重要的概念和原则,运用文字进行讨论。我们的重点是:
    1。网络连接的过程,重点讨论侦听器中的侦听服务名称的来源
    2。如果你遇到问题的时候,你一般可以采取什么样的步骤进行问题诊断
    3。如果你看完我的在线教程之后,同时你在我讲述的每一个地方都进行了自己的练习。但是在工作中,你在网络连接和配置方面存在问题的时候,你可以写email向我求助,需要我的Free技术支持的时候,你应该提供什么信息呢?

第一幕
在分析如图一所示的一次成功的连接过程的内部流程前,我们先提生活当中的一个常见的例子。例子主要的目的是为了帮助我们理解Oracle的网络连接中的流程和关键概念,该例子括号中注释的内容,表示可以和ORACLE中的概念进行联想,以加深印象。假如你(Client) 准备到一个饭店就餐,你先要向饭店预定。 你将向饭店电话总机(数据库服务器主机) 后的某位负责餐位预定的分机(侦听端口) 服务小姐(侦听器)打电话,你会向她说明,你想吃“西湖醋鱼”(你的请求服务service_name),对于服务小姐来说,她会检查她所拥有的菜单中是否注册有“西湖醋鱼”这道菜(侦听中所注册的服务)。如果有的话,表示你的预定连接过程基本上可以成功。在这个过程中,你也许会遇到各种问题,对于客户端的你,你需要饭店的总机号码,负责预定餐位的某位小节的分机号码,当然你如果采用其他预定方式,比如直接走路到饭店预定,也许并不需要电话(对应于Oracle所提供的多种连接协议)。同时也依赖于那位服务小姐是否在正常工作,或许她今天请假,她的工作可以由另外一个分机号码的同事暂时负责。即使她正常工作,你想要品尝的菜品也严重依赖于她手中的菜单是否注册你需要的菜品,另外还存在的风险是负责这道菜品制作的厨师今天休假了。

在这样的预定过程中,你还一直没有和这个饭店背后的其他东西建立连接,比如饭店的厨师们、采购团们等等(这些可以和Oracle的实例做对比)。连接过程中,你并不和饭店背后的任何厨师(Oracle的实例)建立联系。你首先只是和负责预定的服务小姐保持联系,你目前还无法确定,你的这道菜将会出自哪位厨师之手。下面我们将说明类似于生活当中的这个例子,Oracle网络连接背后的流程细节:

步骤一:当我们一旦发出这样的连接,首先要确定你的连接请求是否会被 Sqlnet.ora文件中的有关约定容许。该文件的有关设置可以高级的控制Oracle的网络连接行为。比较典型的是,当你发出:
    SQL>connect / as sysdba
    这表示将采用操作系统的身份验证来连向Oracle数据库实例,但是你的 Sqlnet.ora的文件如果没有如图二中的第三行语句的话(该语句表示可以容许采用操作系统的身份验证),那么将出现失败信息。图一中使用的是采用基于Oracle数据库中的用户名和密码进行身份验证,是默认支持的(连这个都不支持的话,怎么可以呢?)。 图一中的连接串中“@”后的"guoyu"是网络服务名称, 该名称的具体信息通过图二的第四行中所描述的次序进行解析。

步骤二:Tnsnames.ora文件的对于“@guoyu”的网络服务名称的解析。这个解析,类似你向一个饭店预定晚餐的过程。请你自己对照我们前面提到的生活中的例子来对比理解关于网络服务guoyu的描述信息。图三中,红圈一标注的是你想连向主机为shai885c的端口为1521的侦听器,你想获取该侦听器的名为guoyu服务(红圈二标注)。

步骤三。现在的问题是:是否存在这样的一个侦听器并提供这样名为“guoyu”的服务。我们从 图四中的信息,了解到名为“Listener”的侦听器使用了“1521”的端口,并且提供一个名为 “guoyu”的服务。这如同饭店的一个分机号码后服务小姐在工作,而且她的菜单中有你想吃的。更让你高兴的是,这个侦听服务中还跟随着一个名为“guoyu”的实例,它的状态是ready。这好比服务小姐告诉你,负责这道菜的厨师正好可用,没有比这让你更高兴的了。


第二幕
到此为止,我相信你会有愉快的晚餐体验。但是在这里,针对Oracle的网络连接和配置,我们要重点的探究图四中的服务注册信息是从那里来得?饮水思源,以求深入理解我们所研究内容。从图四中,你在名为“guoyu”的服务下面,还能够发现,该服务还有另外一个名为 “guoyu” 的实例,但是它的状态是“unknown”的。这包含的道理是什么?

对于默认的名为 “Listener”的侦听器,注册在其中的服务,有两种来源,一种来自于该计算机上运行着的实例主动的注册到 “Listener”的侦听器中,我们称为“自动注册”,注册在侦听器的服务名称来自于实例的“service_names”参数值,这种“自动注册”有时候需要过一小段时间才可以完成,但不超过3分钟。实例的“service_names”参数,如果我们不去主动修改,会来自于实例的db_name和db_domain的参数值组合。假如,db_name值为“guoyu”,db_domain值为“askguoyu.com”,那么,service_names的参数值等于“guoyu.askguoyu.com”。那么在自动注册到“Listener”的服务名称是“guoyu.askguoyu.com”,为该服务提供真正服务的实例的注册,来自于实例的 Instance_name参数值。有时候,因为某种原因,你会想修改实例的“service_names”参数值。从而该实例注册到默侦听器的服务名称发生变化。自动注册到侦听器中的实例状态会以 “ready”之类还不是“Unknown”的状态来真实的反映实例的状态,请参看图四。

侦听器中的服务名称来源,另外一种就是来自于listener.ora文件中的一些信息。为了你的理解方便和印象深刻,我们可以称之为“强制注册”。请参考 图五。在这个文件中,默认的侦听器关联的数据库服务描述信息为:
 SID_LIST_LISTENER =
    (SID_LIST =
        (SID_DESC =
        (GLOBAL_DBNAME = guoyu)
        (ORACLE_HOME = E:\oracle\ora92)
        (SID_NAME = guoyu)
    )
 )
   在侦听器中强制注册数据库服务信息。在lsnrctl工具的stutas的命令下,侦听器的所提供的service名称来自于上述语句的GLOBAL_DBNAME,伴随的实例名称来自于上述语句SID_NAME的服务信息,可用于client来进行连接。不过,“强制注册”的服务的实例的状态在图四中以“unknown”来表示。

我们可以牵强的以饭店来作比方。比如,某个厨师说他的菜做的很好。他就会主动的到服务小姐的菜单上注册他的拿手好菜,便于顾客点用(和实例的主动到 Listener注册)。另外,服务小姐自己也根据有关信息在菜单上注册一些当前的热点菜品,用于顾客选择,并指定某个厨师来制作这道菜,但是不知道这个厨师是否确切的可以做这道菜。或许他可以应付呢(强制注册)。

在典型的情况下,大家在listener.ora文件的“强行注册”的服务中,一般设定GLOBAL_DBNAME为db_name.db_domain的值,在运行的数据库的实例的service_names值,如果不特别设定的话,会自动为db_name.db_domain的值。这样的话,Listener.ora文件的GLOBAL_DBNAME的值和数据库运行时实例的service_names值一样。也就是吻合的情况,这和图四给大家展示的结果一致:我们发现同样的服务中,有两个实例伴随。一个来自于自动注册。一个来自于listener.ora文件的强制注册信息。如果我们在数据库的参数文件中特别指定service_names为其他值,就是不吻合的情况,数据库运行时的实例在过一小段时间,也会把service_names的内容注册到默认侦听器的服务信息中。

我们在来给出一些声音,希望能够有“余音缭绕”的效果:

声音一:我们(客户端)想获得什么服务的话,那么服务器端的侦听器就应该提供一致的服务。这句话的背后含义是:Tnsnames.ora文件中的service_name和侦听器所提供的server一样要完全一致。这是必须保证的一点。

声音二:在建立连接过程中,实例名称(Instance_name),更多的是针对侦听器的,还不是面向客户的。 Client通过连接侦听器的服务从而连接到Oracle的实例. 这类似于我们到饭店吃饭. 我们只关心这个饭店的服务小姐(侦听器)能够给我们(客户端)提供什么样的菜品服务,我们并不关心饭店背后的厨师,财务,采购人员的名称(统称为实例)。 当我们通过侦听器所提供的服务连接到实例后,实例会给我们分配一个服务进程(如果是专有连接的话)。client从而和实例建立直接的联系。

声音三:Listener.ora中的GLOBAL_DBNAME是可选的,建议它的值来自于db_name.db_domain的值。数据库实例的service_names参数值默认是来自于db_name.db_domain的值,但是我们也可以修改。
posted on 2012-08-01 16:54  敌敌  阅读(3086)  评论(0编辑  收藏  举报