作者:张希
摘 要 该文在介绍Oracle SQL*NET TCP/IP的通信模式及其组成
的基础上,给出SQL*NET TCP/IP各版本下客户端及服务器端的具体配
置,以及利用SQL*NET在分布式环境下进行数据透明存取的应用实例。
要害词 SQL*NET TCP/IP通信模式配置应用
一、引言
SQL*NET是Oracle公司的远程数据访问报文式软件,用于实现客户
机/服务器和服务器/服务器的通信。SQL*NET V2基于Oracle的TNS(Tr
ansparent Network Substrate)和MPI(Multiprotocol Interchange)
新技术,在SQL*NET V1基础上又增加了两种功能即与所有工业标准协
议之间单一、公用的接口以及通过一个或者多个多协议互换连接物理
上独立的网络应用的能力。
以下在概要介绍Oracle SQL*NET TCP/IP的通信模式及其组成的
基础上,给出SQL*NETTCP/IP各版本下客户端及服务器端的具体配置,
以及利用SQL*NET在分布式环境下进行数据透明存取的应用实例。
二、SQL*NET TCP/IP的通信模式及其组成
SQL*NET TCP/IP在网络通信协议层中,对应ISO/OSI模式的第五层
和第六层(即会话层和表示层)。所以它的运行还需第三方的TCP/IP网
络软件支持。基于客户机/服务器的SQL*NET
TCP/IP网络通信模式如图1所示。
在分布式(事务)处理中,通常有两种不同类型的计算机分别起客
户机和服务器的作用。SQL*NET首先确保消除客户机和服务器之间的
所有区别(如内部数据类型表示,NLS国家语言字符集等),以实现客户
机和服务器透明通信。
图1
在完整的分布式处理中,不论是客户机/服务器模式还是服务器/
服务器模式,都包含若干软件成分。图2分别示出客户机/服务器和服
务器/服务器对话阶段的组成部分(以SQL*NET V2为例)
客户机和服务器之间的通信是在对等的关系下以具有相应通信级
别的类似堆栈的方式进行的,堆栈每一层上的逻辑交换单元运送那个
级别所用的综合内容。Oracle客户机和服务器交换SQL语句和数据行,
在各UPI/OPI(User/Oracle Programmatic Interface)层,将这些交换
转换成一系列对SQL例程(如注册、语法分析、执行等)的调用。SQL*N
ET层将这些调用作为一系列Oracle发送/接收报文对待。TNS负责解决
所有一般性的机器及连通问题(如服务器或TNS的终点位置,辨别连接
中是一个还是多个Multiprotocol Interchange多种协议互换等),Ora
cle协议适配器则负责把TNS功能映像到客户机/服务器连接中所用的
任何工业标准协议上,或在multicommunity(多群体)连接情况下客户
机服务器的某些组成部分所用的工业标准协议上。
图2
三、SQL*NET TCP/IP 的配置
1.SQL*NET V1的配置
(1)服务器端.在/ect/services文件中加入下列行:
orasrv
1525/tcp
(orasrv是SQL*NET V1使用的服务进程,1525为ORACLE公司推荐用
户使用的TCP/IP的端口号).在/etc/hosts文件中加入数据库服务器的
主机名和绝对地址:
如:
202.119.13.99 fgg0
202.119.13.98 fgg1
(2)客户端
在oracle.ini文件中加入:
local=host-string (缺省数据库)
remote=host-string (远程数据库)
host-string也称connect-string(连接串),用来指明要连接的Or
acle数据库。
host-string的形式为:
net-prefix:host.name:SYSTEM.ID
其中:net-prefix 网络协议前缀,对于TCP/IP为T
host name Oracle服务器的主机名,此主机名应在hosts文件中描
述过。
SYSTEM ID ORACLE服务器的标识符。
上述两个数据库服务器的host-string分别为:
t:fgg0:ora7
t:fgg1:ora7
2.从SQL*NET V1升级到SQL*NET V2的配置
(1)服务器端
.在/ect/services文件中加入下列行:
listener
1521/tcp
.在oracle-home/network/admin目录中配置listener.ora文件:
LISTENER:
(ADDRESS-LIST:
(ADDRESS:
(PROTOCOL:tcp)
(HOST:fgg0)
(PORT:1521)
)
)
STARTUP-WAIT-TIME-LISTENER=0
CONNECT-TIMEOUT-LISTENER=10
SID-LIST-LISTENER=
(SID-LIST:
(SID-DESC:
(SID-NAME:ora7)
(ORACLE-HOME:/eXPort/home/oracle7)
)
)
TRACE-LEVEL-LISTENER=OFF
·如是分布式数据库,且有多个V2节点,则还需配置tnsnames.ora
文件:
(参见客户端此文件)
·如网络中包含一个或多个Multiprotocol Interchang(多种协
议互换),则还需配置tnsnav.ora文件:
·如在采用SQL*NET V2 后启用ORACLE7的多线索,则需在oracle-
home/dbs/oracle7.ini(ORACLE初始化参数文件)加入下列行:
mts-dispatchers="tcp,1"
mts-max-dispatchers=10
mts-servers=1
mts-max-servers=10
mts-service:ora7
mts-listener-address:"(ADDRESS=(PROTOCOL:tcp)(PORT:1521)
(HOST:fgg0))"
(2)客户端
.在c:\orawin\network\admin目录中配置tnsnames.ora文件:
fgg0:
(DESCRIPTION:
(ADDRESS-LIST:
(ADDRESS:
(PROTOCOL:TCP)
(Host:202.119.13.99)
(Port:1521)
)
)
(CONNECT-DATA:(SID:ora7)
)
)
fgg1:
(DESCRIPTION:
(ADDRESS-LIST:
(ADDRESS:
(PROTOCOL:TCP)
(Host:202.119.13.99)
(Port:1521)
)
)
(CONNECT-DATA:(SID:ora7)
)
)
.在c:\windows\oracle.ini文件中将"local=......."改为:loca
l=fgg0。
四、连接数据库
可使用下列两种方法之一连接数据库:
1.在SQL*PLUS中,用CONNECT命令。
如需连接到fgg0主机上的数据库,可用:
connect scott/tiger@t:fgg0:ora7 (用SQL*NET V1连接)
connect scott/tiger@fgg0
(用SQL*NET V2连接)
2.在启动SQL*PLUS时,指明所需连接的数据库。
如需连接到fgg1主机上的数据库,可用:
sqlplus scott/tiger@t:fgg1:ora7 (用SQL*NET V1连接)
sqlplus scott/tiger@fgg1
(用SQL*NET V2连接。)
五、存取数据库
一旦配置好了SQL*NET,运行在网络上的Oracle工具,服务器均可
存取、修改、共享和存储在其它服务器上的数据。Oracle分布式数据
库系统提供多种存取远程数据库的方法。
1.建立数据库链路
Oracle中的数据库链路为远程数据库定义一路径。一旦建立了数
据库链路,任何一个连接到本地数据库的应用,均可通过数据库链路引
用远程数据库上的表和视图,仅需在相应的SQL语句中所引用的远程表
和视图后加上@数据库链路名。
如:在fgg1主机上建立一引用fgg0数据库的数据库链路:
create public database link link0 using'fgg0';(根据需要
可建立公用和专用的数据库链路)
在本地查询fgg0数据库中表temp:
select * from scott.temp@link0;
2.建立表快照
ORACLE的表快照(table snapshot)答应一个主表在分布式数据库
的其它结点进行复制。使用快照可在本地为远程数据维持只读副本。
如在fgg1上建立fgg0数据库中表temp的快照:
create snapshot tempshot as select * from scott.temp@lin
k0;
查询快照:
select * from tempshot;
在定义快照时还可指定快照刷新的时间和方式,以确保快照及时
、正确地反映主表中的数据。
3.数据库之间数据复制
使用SQL*PLUS的COPY命令可在网络上的数据库之间进行表及表的
数据复制。
如在fgg1上复制fgg0数据库中表temp,复制后的表名为temp1:
copy from scott/tiger@fgg0
replace temp1
using select * from temp
根据需要可使用replace,create,insert,update四种控制语句。