標籤:
DBLINK詳解
1.建立dblink文法:
CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’
說明:
1) 許可權:建立資料庫連結的帳號必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系統許可權,用來登入到遠端資料庫的帳號必須有CREATE SESSION許可權。這兩種許可權都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK許可權在DBA中)。一個公用資料庫連結對於資料庫中的所有使用者都是可用的,而一個私人連結僅對建立它的使用者可用。由一個使用者給另外一個使用者授權私 有資料庫連結是不可能的,一個資料庫連結要麼是公用的,要麼是私人的。
2)link : 當GLOBAL_NAME=TRUE時,link名必須與遠端資料庫的全域資料庫名global_name)相同;否則,可以任意命名。
3)connectstring:連接字串,tnsnames.ora中定義遠端資料庫的串連串。
4)username、password:遠端資料庫的使用者名稱,口令。如果不指定,則使用當前的使用者名稱和口令登入到遠端資料庫。
2.刪除資料庫連結的語句:
DROP [PUBLIC] DATABASE LINK zrhs_link
3.查看已建立的dblink
select owner,object_name from dba_objects where object_type=‘DATABASE LINK‘;
4.dblink的引用:
[user.]table|[email protected]
如:
SELECT * FROM [email protected]_link;
SELECT * FROM [email protected]_link ;
5.建立同義字:
對於經常使用的資料庫連結,可以建立一個本地的同義字,方便使用:
CREATE SYNONYM worker_syn FOR [email protected]_link;
6.建立遠程視圖:
CREATE VIEW worker AS SELECT * FROM [email protected]_link where…;
現在本視圖可與本機資料庫中的任何其它視圖一樣對待,也可以授權給其它使用者訪問此視圖,但該使用者必須有訪問資料庫連結的許可權。
其他:
修改GLOBAL_NAME的方法:
1.在遠端資料庫的init.ora檔案中將global_names設為false。
或者
2.用sys使用者執行如下語句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
修改後重新啟動資料庫設定才會生效。
資料庫全域名稱可以用以下命令查出:SELECT * FROM GLOBAL_NAME;
===== dblink 實戰 ======
1.dblink分為公有和私人兩類。
公有dblink使用public修飾關鍵字。在create和drop的時候都需要使用public關鍵字。
公有dblink對所有人開放,在該dblink之上建立的同義字也會隨之對所有人開放。(測試並確認,不過測試是在一個執行個體多個使用者之間進行)
私人dblink只有建立者可以訪問,其上的同義字不能被其他使用者訪問。需為使用者建立視圖,並將視圖授權給所需使用者後,使用者才可訪問該視圖。
另外,不能將帶有dblink的同義字直接授權給使用者。否則報錯,其等價於:
grant select on [email protected] to user2 *
ERROR at line 1:
ORA-02021: DDL operations are not allowed on a remote database
2.建立dblink時,可以使用連接字串(與tnsname.ora中的),效率較高。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:建立資料庫連結的帳號必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系統許可權,用來登入到遠端資料庫的帳號必須有CREATE SESSION許可權。這兩種許可權都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK許可權在DBA中)。
兩台不同的資料庫伺服器,從一台資料庫伺服器的一個使用者讀取另一台資料庫伺服器下的某個使用者的資料,這個時候可以使用 dblink。
其實dblink和資料庫中的view差不多,建dblink的時候需要知道待讀取資料庫的ip地址,ssid以及資料庫使用者名稱和密碼。
建立可以採用兩種方式:
1、已經配置本地服務
create public database
link fwq12 connect to fzept
identified by neu using ‘fjept‘ Create DATABASE LINK 資料庫連結名CONNECT TO 使用者名稱 IDENTIFIED BY 密碼 USING ‘本地配置的資料的執行個體名’;
2、未配置本地服務
create database link linkfwq
connect to fzept identified by neu
using ‘(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = fjept)
)
)‘;
host=資料庫的ip地址,service_name=資料庫的ssid。
其實兩種方法配置dblink是差不多的,我個人感覺還是第二種方法比較好,這樣不受本地服務的影響。
資料庫連接字串可以用NET8 EASY CONFIG或者直接修改 TNSNAMES.ORA裡定義.
資料庫參數global_name=true時要求資料庫連結名稱跟遠端資料庫名稱一樣
資料庫全域名稱可以用以下命令查出
Select * FROM GLOBAL_NAME;
查詢遠端資料庫裡的表
Select …… FROM 表名@資料庫連結名;
查詢、刪除和插入資料和操作本地的資料庫是一樣的,只不過表名需要寫成“表名@dblink伺服器”而已。
附帶說下同義字建立:
Create SYNONYM 同義字名FOR 表名;
Create SYNONYM同義字名FOR 表名@資料庫連結名;
刪除 dblink:Drop PUBLIC DATABASE LINK linkfwq。
如果建立全域dblink,必須使用systm或sys使用者,在database前加public。
oracle dblink解決後台卻出現鎖
建立是很簡單,但是在使用中後台卻出現鎖,查看這個鎖的方法可以去console中看到或者查詢資料庫。其實這個鎖倒
不是最讓人心煩的,而是每次使用 dblink查詢的時候,均會與遠端資料庫建立一個串連,dblink應該不會自動釋放這個串連
,如果是大量使用dblink查詢,會造成Web 專案的串連數不夠,導致系統無法正常運行。
例子:
create database link hr_tables
connect to manbu
identified by "admin"
using ‘WALK‘
其中hr_tables是遠端資料庫的一個別名
manbu是遠端資料庫的資料庫使用者名稱
admin為manbu的密碼
WALK為資料庫在本機資料庫的SID (具體說是本機資料庫伺服器的服務名。需要在本機伺服器tnsname.ora上建立一個服務。而不是在用戶端建。)
接著,我們可以做一下測試,比如我們想拿到資料庫的某一張表資料,那我們可以在命名行下做如下的測試:
select user_name from [email protected]_tables;
每一張表都必須加上@hr_tables字串,表示該表是dblink所指向的遠端資料庫的表單
或者,你會覺得這樣子很麻煩,那我們可以為[email protected]_tables配置一個別名,那就沒有改須麻煩啦。
建立[email protected]_tables的同義字,也即別名:
create synonym mall_user for [email protected]_tables;
(轉)Oracle 使用 DBLINK詳解