作者:張希
摘 要 該文在介紹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四種控制語句。