分散式資料庫元件——Database Link
今天我們一起聊聊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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hadoop元件--分散式資料庫HbaseHadoop元件分散式資料庫
- 資料庫連結(database link)小結資料庫Database
- 分散式資料庫分散式資料庫
- oracle create database link_資料庫連結測試OracleDatabase資料庫
- 分散式資料庫概述分散式資料庫
- Greenplum資料庫,分散式資料庫,大資料資料庫分散式大資料
- 分散式資料庫系列(三)分散式資料庫
- 分散式資料庫系列(二)分散式資料庫
- 分散式資料庫系列(一)分散式資料庫
- 分析型資料庫:分散式分析型資料庫資料庫分散式
- 分散式資料庫 ZNBase 的分散式計劃生成分散式資料庫
- 《分散式資料庫HBase案例教程》分散式資料庫
- 分散式資料庫管理系列(一)分散式資料庫
- openGauss 分散式資料庫能力分散式資料庫
- 分散式資料庫如何控制資料重複 ?分散式資料庫
- 分散式資料庫火了 開源填補資料庫空白分散式資料庫
- 分散式資料庫技術論壇分散式資料庫
- “熱搜”中的分散式資料庫分散式資料庫
- 分散式資料庫排序及優化分散式資料庫排序優化
- 聊聊分散式 SQL 資料庫Doris(三)分散式SQL資料庫
- 聊聊分散式 SQL 資料庫Doris(四)分散式SQL資料庫
- 聊聊分散式 SQL 資料庫Doris(六)分散式SQL資料庫
- 聊聊分散式 SQL 資料庫Doris(七)分散式SQL資料庫
- 聊聊分散式 SQL 資料庫Doris(八)分散式SQL資料庫
- 分散式資料庫的健康評估分散式資料庫
- 分散式資料庫系統(DDBS) 概述分散式資料庫
- 分散式時序資料庫InfluxDB分散式資料庫UX
- 分散式資料庫 RethinkDB 2.0 釋出分散式資料庫
- ArcGIS Engine+分散式資料庫操作分散式資料庫
- 【大資料】BigTable分散式資料儲存系統分散式資料庫 | 複習筆記大資料分散式資料庫筆記
- (二) MdbCluster分散式記憶體資料庫——分散式架構1分散式記憶體資料庫架構
- 分散式資料庫入門:以國產資料庫 TDSQL 為例分散式資料庫SQL
- 透過Database Link/IMPDP,同步10G、11G資料庫失敗Database資料庫
- database link概述Database
- CREATE DATABASE LINKDatabase
- Database Link使用Database
- 建立Database LinkDatabase
- oracle database linkOracleDatabase