關於 分布式Oracle中 database link

來源:互聯網
上載者:User

在做分散式資料庫時難免用到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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.