在跨數據庫查詢的時候時常會用到dblink,例如:兩台不同的數據庫服務器,從一台數據庫服務器的一個用戶讀取另一台數據庫服務器下面的某個schema的數據,這個時候,使用dblink能夠很方便的實現。
dblink和數據庫中的view功能類似,建立dblink的時候需要直接到待讀取數據庫的ip地址,ssid以及數據庫的用戶名和密碼。
第一部分:如何創建dblink
dblink的創建有兩種方式:
1、在本地數據庫tnsnames.ora文件中配置要訪問的目標數據庫信息
create [public] database link to_mai
connect to scott identified by tiger using 'to_mai';
其中第一個to_mai是將要創建的dblink的名字,
第二個to_mai是tnsnames.ora文件中配置的目標數據庫mai的連接信息:
to_mai =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mai)
)
)
scott/tiger是登錄到遠程數據庫的用戶名和密碼,然后當在本地數據庫使用to_mai的dblink訪問遠程數據庫的時候,會使用scott的身份來訪問
2、本地數據庫tnsnames.ora文件中沒有配置要訪問的數據庫信息
create [public] database link to_mai
connect to scott identified by tiger
using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mai)
)
)';
這一種方式其實是把第一種配置在tnsnames.ora文件中的信息,直接放在dblink的后面
要查詢對方數據庫的表TableName語句如下:
SELECT 字段名 FROM TableName@數據鏈名稱;
第二部分:dblink相關的權限
SYS@test > select * from user_sys_privs where privilege like upper('%link%');
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
SYS CREATE DATABASE LINK NO
SYS DROP PUBLIC DATABASE LINK NO
SYS CREATE PUBLIC DATABASE LINK NO
權限解釋:
CREATE DATABASE LINK(所創建的DBlink只能是創建者自己使用,別的用戶都使用不了)
CREATE PUBLIC DATABASE LINK(public表示所創建的dblink所有用戶都可以使用)
DROP PUBLIC DATABASE LINK(刪除Public dblink的權限)
第三部分:dblink的使用
假如說,我要比較兩個庫的用戶的差異,那么我現在可以這么做:
select username from dba_users@to_mai
minus
select username from dba_users;
這樣就可以得到在目標數據庫中有的用戶,而在當前用戶中沒有的用戶列表了
另外一個:如果你樂意,你可以用triggers+dblink實現一個簡單的數據同步,不過不建議使用,玩玩就行了。
第四部分:dblink的相關視圖
dblink的常用視圖有如下幾個:
dba_db_links,查看系統中所有的dblink
v$dblink,用來查看當前數據庫中有哪些打開的dblink
select * from user_db_links; --用戶 DB Link
select * from dba_db_links; --dba DB Link
select * from v$dblink; --當前DB Link
Drop
database
link MYDBLINK1;
如果是相同實例,不同用戶,可以用如下方法查詢
select * from 用戶名.表名