分散式資料庫元件——Database Link

realkid4發表於2011-02-18

 

今天我們一起聊聊Database Link。

 

Database Link(下面簡稱為DBLink)是Oracle分散式資料構建的一個基石技術。透過DBLink,將兩個物理上獨立的資料庫連線了起來,使得客戶端有可能透明的訪問兩個資料庫上的資料和物件。而客戶端角度看,訪問的資料庫好像只有一個。

 

 

分散式資料庫是現代分散式系統的一個重要元件。傳統集中式資料庫中,資料庫例項可能有多個,但是資料庫(檔案)只有一份。進行的查詢都是在一個資料庫中進行,進行的事務都是在一個例項下完成。

 

分散式資料庫的一個特性就是例項是多個,同時資料庫也是多個,分佈在不同的物理伺服器上。由於物件和例項的分佈特性,所以查詢一個資料,訪問的例項和資料庫可能是多個,進行dml操作的事務也隨著上升為分散式事務。

 

 

DB Link簡介

 

簡單的說,DB Link就是建立在兩個資料庫伺服器上面的單向連結資料通道。從資料庫物件的角度看,DB Link是一個物件,結構和定義是儲存在資料庫伺服器上的。當客戶端登入到資料庫伺服器A上後,透過呼叫在A上定義的DB Link,可以訪問到資料庫伺服器B上的資料物件。但是,這種連線是一種單向連結,登入到伺服器B上的客戶端是不能借這個連結訪問到資料庫伺服器A上的物件。因為DB Link的定義是儲存在伺服器A的資料字典中。

 

 

首先我們看一個小例子。我們有兩個資料庫伺服器wilson和orcl。Wilson是一臺執行在CentOS上的Oracle11g伺服器,而Orcl是在windows環境下。現在要建立一條從orcl訪問到wilson資料庫的dblink。

 

 

//首先登入orcl

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> create database link DB_WILSON

  2    connect to HR identified by HR

  3    using 'WILSON';

 

Database link created

 

 

首先,我們登入orcl,以soctt使用者登入系統。使用create database link語句建立一個database link。語句的含義:建立一個dblink,連線到本地命名服務wilson對應的資料庫伺服器上,連線的時候使用HR/HR作為使用者名稱和密碼。

 

注意:create database link語句是需要使用者具有create database link的系統許可權。如果沒有,就不能建立。

 

建立之後,我們發現建立的dblink名稱不為db_Wilson,而是加入了wilson的全域性網路名稱。為:DB_WILSON.REGRESS.RDBMS.DEV.US.ORACLE.COM;使用DB Link的方法,如下:

 

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> select * from jobs@DB_WILSON.REGRESS.RDBMS.DEV.US.ORACLE.COM;

 

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY

---------- ----------------------------------- ---------- ----------

AD_PRES    President                                20080      40000

(篇幅原因,有省略……

PR_REP     Public Relations Representative           4500      10500

 

19 rows selected

 

 

使用“物件名[呼叫方法]@db_link_name”,就可以訪問到遠端物件。jobs資料表是資料庫範例表HR Schema下的資料資訊。

 

 

在進行下面的內容介紹前,說明兩個問題。

 

首先,是訪問db link的資料表@後面的名稱問題。在設計環境中,可以使用同義詞synonym技術將@後面的內容遮蔽掉,讓應用層面做到透明化。

 

其次,就是oracle10g與11g進行互動時候的小技巧。在Oracle11g之前,資料庫密碼是不區分大小寫的。內部儲存校驗密碼的時候,都是將其轉換為大寫字母后進行處理。建立dblink的時候,輸入的登入使用者名稱,密碼(connect to HR identified by HR),也是用大寫字母進行密碼儲存作為固定使用者的登入資訊。這種機制在oracle10g以及之前的版本中都沒有什麼問題。當連線涉及到oracle11g的時候,就會出現一些問題。

 

Oracle11gR1開始,密碼大小寫不識別的情況被修正了。如果Oracle11g的使用者密碼含小寫字元,那麼我們在Oracle10g端建立dblink的時候,即使輸入了正確的密碼字元。Oracle10g會自動將其轉換為大寫字元。連線11g的時候,使用這個大寫字元進行驗證,自然會報錯誤。這也算是一個不大不小的陷阱了。

 

為了避免這個陷阱,筆者在實驗前,執行了密碼變換,將密碼轉為了大寫。

 

//login the oracle 11g

 

SQL> conn sys/sys@wilson as sysdba;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

 

SQL> alter user HR identified by HR;

 

User altered

 

 

 

下面我們來看看dblink的本質。我們知道,客戶端連線到資料庫例項之後,在例項上是透過server process進行代理進行操作。一直以來,操作本地資料庫(local database)的時候,server process與例項程式進行互動,獲取本地資料庫資料。那麼,在使用dblink的時候,這個過程是怎麼樣的呢?

 

我們檢查一下程式情況。在確保沒有其他連結到oracle11g伺服器的情況下,我們檢查伺服器所在Linux的程式情況。

 

 

//檢視程式連線

[oracle@oracle11g ~]$ ps -ef | grep ora

(篇幅原因,省略部分後臺程式列表……

oracle    5727     1  0 15:12 ?        00:00:00 ora_smco_wilson

oracle    5729     1  0 15:12 ?        00:00:00 ora_w000_wilson

oracle    5749     1  0 15:15 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5751     1  3 15:15 ?        00:00:00 ora_j000_wilson

oracle    5753     1  1 15:15 ?        00:00:00 ora_j001_wilson

oracle    5754  5517  0 15:16 pts/0    00:00:00 ps -ef

oracle    5755  5517  0 15:16 pts/0    00:00:00 grep ora

 

 

注意,當我們使用過dblink後,在link的remote資料庫上出現了一個server process程式,而且是長期儲存。根據我們的之前blog中對server process的實驗,server process是一個忠實於client的程式物件。只要client存在,並且保持連線,server process會一直駐留在伺服器程式列表中。

 

現在我們看到了有server process駐留在裡面,說明存在與dblink相關的一個client,在與其建立通訊呼叫關係。那麼,究竟是誰呢???

 

SQL> select saddr,sid,serial#,paddr,user#,username,status,osuser,PROGRAM from v$session where paddr in (select addr from v$process where spid in (5749));

 

SADDR           SID    SERIAL# PADDR         USER# USERNAME        STATUS   OSUSER                         PROGRAM

-------- ---------- ---------- -------- ---------- ------------------------------ -------- ------------------------------ ------------------------------------------------

38295E1C         35         11 38BC56E4   85 HR   INACTIVE SYSTEM ORACLE.EXE

 

 

根據OS上面的SPID編號(5749),我們定位了會話的資訊(SID=35)。使用的資料庫使用者是HR,程式名稱為ORACLE.exe。

 

到這裡,我們似乎可以猜到dblink的工作原理了。ORACLE.exe是Oracle在Windows下的例項程式程式,其中的Server process和後臺程式都被實現為執行緒模型。但是在使用dblink連線到remote database的時候,卻是充當了program客戶端的角色。

 

在回顧一下我們建立dblink的引數:一個本地命名服務名、登入使用者名稱/密碼。這些資訊完全具備了客戶端登入伺服器的全部要素。那麼,一切都可以清楚了。

 

當我們使用dblink,要求訪問remote資料物件資料時候。本地例項上的程式(server process)會去充當客戶端程式的角色,利用本地命名服務和使用者名稱密碼連線遠端伺服器。之後的過程同一般的客戶端連線伺服器沒有任何差距了。

 

 

當訪問資料(如select),實際上是將資料從遠端的資料庫伺服器上,透過dblink對應的連線線路,傳遞到本地資料庫伺服器例項上,再進行額外的處理。如果直接返回結果,就將remote例項上的資料,經過local例項,傳回到客戶端。的確是很漫長的過程……如果需要和local資料庫上的資料表進行額外的關聯查詢或者連線,就在local例項上進行。

 

 

下篇中我們系統的介紹一些不同型別dblink和各自的特點。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-687469/,如需轉載,請註明出處,否則將追究法律責任。

相關文章