《深入解析ORACLE》学习笔记(2)---ORACLE数据库访问

来源:互联网 发布:php必会的基础知识 编辑:程序博客网 时间:2024/05/21 15:40

[声明:本文是学习著名ORACLE DBA盖国强先生的大作《深入解析ORACLE--DBA 入门 进阶与诊断案例》的学习笔记与心得体会。在此声明,文中摘录了书中部分内容,非是出于抄袭目的,而是有感于盖国强先生所写确实经典。在此声明对原作者的尊重与敬佩。]

 第一章  数据库的访问


   数据库服务器上可以通过本地连接来连接服务器,通过SYSDBA身份登录,进行日常事务管理。但要通过远程访问,就需要做一些特殊设置了。Oracle为我们提供了一个非常强大且易于管理的工具来达到网络访问数据库的目的---Listener/Tnsnames机制。
 下面简单介绍下这个机制:
 Listener/Tnsnames是一套C/S模型的机制。Listener负责再服务器上监听来自远端的连接请求,而Tnsnames则是远端的连接协议。用户在使用这套机制的时候,只需要通过Oracle的工具Net Configure Assistant对配置文件进行
配置即可。服务器端的配置文件是Listener.ora,远端的则是Tnsnames.ora。

一:远端Tnsnames.ora配置
 配置举例:
 TTECDIS =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.114.222)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = kanon)
     )
   )
 Tnsnames.ora位于目录$ORACLE_HOME/network/admin.文件内包含两部分内容:ADDRESS_LIST 描述了连接使用的协议、服务器地址和端口;CONNECT_DATA描述了目标服务器名(SERVICE_NAME)。

二:服务器端Listener.ora配置
 在服务器端,存在一个初始化参数SERVICE_NAME,这个参数就是用于定义客户端文件(tnsname.ora)请求的服务器端的服务名,也是服务器端文件(listener.ora)提供的服务名。
 可以使用show parameter service_name来查看。
 修改了服务器的SERVICE_NAME参数,监听文件listerner.ora文件也要做出修改,使二者保持一致,并使客户端的tnsnames.ora内的SERVICE_NAME与之一致。才能保证通畅。
 此处特意将服务器的SERVICE_NAME设置为两个值,以描述客户端请求服务器端连接的对应关系。
 ALTER SYSTEM SET SERVICE_NAMES='kanon,emily' scope=both--此修改将使的spfile与内存同时被修改,下面是监听器的配置。
 配置举例: 
 LISTENER =
   (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
     )
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
     )
   )

 SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (GLOBAL_DBNAME = kanon)
       (ORACLE_HOME = $ORACLE_HOME/)
       (SID_NAME = ttecdis)
     )
     (SID_DESC =
       (GLOBAL_DBNAME = emily)
       (ORACLE_HOME = $ORACLE_HOME/)
       (SID_NAME = ttecdis)
     )
   )
 Listener.ora位于目录$ORACLE_HOME/network/admin.文件内包含两部分内容:LISTENER包含了监听使用的协议、本机地址和监听端口;SID_LIST_LISTENER描述了本机对外提供的服务(GLOBAL_DBNAME)。
完成上述两端的配置后,客户端就可以连接服务器了。
服务器实现启动监听程序,向外提供服务kanon与emily(GLOBAL_DBNAME参数描述的值就是对外提供的服务器名),客户端根据本地的tnsnames.ora文件,可以向服务器上的kanon(SERVICE_NAME参数描述的值就是目的服务)
发起连接。换言之:tnsname.ora内的SERVICE_NAME要与服务器端的GLOBAL_DBNAME相同。
 在另外的客户端配置一个tnsnames.ora,配置信息如下:
 TTECDIS =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.114.222)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = emily)
     )
   )
 此客户端便可以向服务器上的emily服务发起连接了。
 而客户端并不需要关心它连接的数据库究竟是哪个,更不会想到两个客户端连接的是同一个数据库了。

扩展:
在Oracle8i以及之后的版本里,Oracle引入了一个动态服务注册功能。所谓动态服务注册是指当实例启动之后,由后台进程PMON在监听器中注册数据库服务器信息,在此机制下,原来监听器配置文件listener.ora
中的DIS_LIST部分将不是必须的,默认的配置文件里面也的确是没有这部分的。