每当我们发出如下命令: 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的实例)建立联系。你首先只是和负责预定的服务小姐保持联系,你目前还无法确定,你的这道菜将会出自哪位厨师之手。下面我们将说明类似于生活当中的这个例子,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。这好比服务小姐告诉你,负责这道菜的厨师正好可用,没有比这让你更高兴的了。 对于默认的名为 “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的值,但是我们也可以修改。 |