在做分散式資料庫時難免用到dblink,但關於dblink的資料很少,很多書上提到了,但不詳細。
資料庫連結定義從一個Oracle資料庫到另一個資料庫的單行通訊通道。
建立連結前要先有到遠端資料庫的命名服務(連接字串),就是tnsnames.ora中描述的那個,如'oradXP'
先測試一下:$tnsping oradxp
Attemping to contact(...) OK(30毫秒).
說明對遠端資料庫oradxp可訪問。
建立資料庫連結的文法為:
CREATE PUBLIC DATABASE LINK oradxp.cug.edu.cn USING 'oradxp';
其中 oradxp.cug.edu.cn 必須是遠端資料庫的全域名(SID),'oradxp'就是到遠端連接字串。遠端資料庫的全域名可以通過登陸遠程機,
SELECT * FROM global_name;
得到。
現在你就可以用連結oradxp.cug.edu.cn訪問遠端資料庫了
如
SELECT * FROM global_name@oradxp.cug.edu.cn;
看看得到的是不是遠程機的全域名。
所有SELECT 語句後面跟上連結名都是對遠程機的訪問。
注意:登陸名口令就是當前登陸原生使用者名稱和口令。也就是如果你用的是public連結,那麼在遠程就要有一個和本機相同的使用者/口令才行。如:你以aaa/aaa登入本機,然後執行
SELECT * FROM BBB.bbb@oradxp.cug.edu.cn;
那麼對遠端資料BBB.bbb的訪問使用者為aaa口令為aaa
也就是在本機和遠程機上都有使用者aaa口令都為aaa才能執行成功!
關於私人連結:
CREATE DATABASE LINK oradxp.cug.edu.cn CONNECT TO system IDENTIFIED BY aaa;
這就建立了system的私人連結。
私人連結和public連結的差別就是登入名稱口令的限制。也就是
你不管用什麼使用者登入本機,執行
SELECT * FROM BBB.bbb@oradxp.cug.edu.cn;
訪問遠程機資料BBB.bbb的使用者和口令都為system/aaa
建好的資料連結放在系統資料表SYS.link$表中
通過OEM控制台的 分布-〉資料庫連結可以查看所有的連結。
要刪除public link 可以
drop public database link linkname;
對於私人連結先以相應使用者登陸,如上述system/aaa
然後drop database link linkname;
當然,直接刪除SYS.link$表中的記錄一樣可行。
---------------------------------------------
不放心的dblink--手工關閉dblink [REF]
在csdn裡看使用者問道了有關dblink的關閉問題,本人一直對這個dblink持保留態度,如果不用最好不用。
在我們使用dblink對遠端oracle資料庫進行操作時,這個dblink的訪問會單獨建立到遠端一次會話,這個到遠端資料庫的session,並不會在你建立的以後就自動的關閉和遠程伺服器建立的session,所以這是很可怕的,如果一個不斷查詢會產生很多個到遠端資料庫session,如果session太多,造成查詢失敗,所以只要一點,筆者一直對這個dblink這個技術保持著保留態度,能不去使用她,盡量不去使用她。
不過如果使用dblink,我們需要及時顯示的關閉dblink。以下提供兩種方式
1.
alter sesssion close database link <dblink_name>;
2.
dbms_session.close_database_link(<dblink_name>);
如果是每個串連之後,還要使用者去commit,以及手工的去colse一下。實在是痛苦之至呀。
------------------------------------------
如果Oracle資料庫是以read only模式開啟的,則無法通過db link訪問遠端資料庫。因為只要通過db link,即使只執行select,oracle也是要開啟分散式交易支援的,事務需要分配復原段,而read only模式下是沒有online的復原段的:
SQL>select 1 from dual@lnk_db1;
select 1 from dual@lnk_db1
*
ERROR at line 1: ORA-16000: database open for read-only access
在一個read write的庫上做個測試,可以看到通過db link的查詢確實開啟了事務,並且分配了復原段。
SQL>select sid from v$mystat where rownum=1; SID---------- 1270SQL>select 1 from dual@lnk_db1; 1---------- 1SQL>select s.sid,s.serial#,s.sql_hash_value, 2 r.segment_name, 3 t.xidusn, 4 t.xidslot, 5 t.xidsqn 6 from v$session s, 7 v$transaction t, 8 dba_rollback_segs r 9 where s.taddr = t.addr 10 and t.xidusn = r.segment_id(+); SID SERIAL# SQL_HASH_VALUE SEGMENT_NA XIDUSN XIDSLOT XIDSQN---------- ---------- -------------- ---------- ---------- ---------- ---------- 1270 37655 0 _SYSSMU10$ 10 45 2042124
可以看到session 1270雖然只執行了一條select語句,但是由於使用了db link,確實開啟了一個活動事務,並且分配了一個復原段_SYSSMU10$。
Update:七公提醒了一下,實際上還是有辦法繞過這個問題的。Oracle提供了read only的事務,是無須用到復原段的。
SQL>select 1 from dual@lnk_db1;select 1 from dual@lnk_db1 *ERROR at line 1:ORA-16000: database open for read-only accessSQL>set transaction read only;Transaction set.SQL>select 1 from dual@lnk_db1; 1---------- 1