工作中接觸到DBLINK,想多瞭解一下
實驗對象爲本地主機的兩個庫ORCL、ORCL1,tnsnames.ora如下:
ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl1)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
用戶1: hr/hr@orcl 用戶2:scott/tiger@orcl1
注意:在scott@orcl1上創建指向hr@orcl的數據庫鏈接,orcl1上沒有名爲hr的用戶
1.查看用戶權限
--查詢是否直接賦予了創建DBLINK的權限
SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE LIKE '%DATABASE LINK%';
--如果有DBA角色也能建DBLINK
SELECT * FROM USER_ROLE_PRIVS;
--查詢現有DBLINK
SELECT OBJECT_NAME,CREATED,STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE='DATABASE LINK';
注意:創建DBLINK的用戶要有創建權限,DBLINK指向的用戶需要有CREATE SESSION權限和其他相關權限。
2.授予用戶相關權限
SYS@orcl1>GRANT CREATE DATABASE LINK ,CREATE PUBLIC DATABASE LINK TO SCOTT;
3.通過使用網絡服務名創建私有DBLINK
--密碼注意大小寫,如果是數字,用""括起來
CREATE DATABASE LINK HR_ORCL_LOCALHOST CONNECT TO HR IDENTIFIED BY hr USING 'ORCL';
注意:本次實驗環境爲本地主機的兩個庫上完成,配置了本地的TNS服務,所以創建時可以使用本地配置的數據庫實例名ORCL;在生產環境中,如果遠程服務端沒有connect string,配置在客戶端tnsnames.ora中的connect string是不能在DBLINK中使用的
4.通過使用連接串創建公有DBLINK
CREATE PUBLIC DATABASE LINK PUB_HR_ORCL_LOCALHOST CONNECT TO HR IDENTIFIED BY hr
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.240)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)';
注意: 本次實驗中第一次做的時候報找不到監聽和連接超時的錯誤,需要對本地ip地址配置好監聽才能訪問成功,本機listener.ora如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Chujf\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Chujf\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = ORCL1)
(ORACLE_HOME = D:\app\Chujf\product\11.2.0\dbhome_1)
(SID_NAME = orcl1)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = D:\app\Chujf\product\11.2.0\dbhome_1)
(SID_NAME=orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.240)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost )(PORT = 1521))
)
)
ADR_BASE_LISTENER = D:\app\Chujf
5.測試數據庫鏈接是否可用
SELECT * FROM USER_TABLES@HR_ORCL_LOCALHOST;
SELECT * FROM USER_TABLES@PUB_HR_ORCL_LOCALHOST;
6.其他注意事項
(1). global_names boolean FALSE
:當連接庫(本試驗中的orcl1)參數GLOBAL_NAMES設置爲TRUE時,DATABASE LINK的名稱必須與被連接庫的GLOBAL_NAME 一致;
(2).如果創建數據庫鏈接時不指定用戶名和密碼,則使用當前的用戶名和密碼登錄遠程數據庫;
(3).dblink需要臨時端口號,當沒有端口號可用的時候,dblink就無法使用了;
(4).使用dblink更新遠程庫表上的數據時,會在遠程庫創建會話並在表上加鎖、查詢也是分佈式的事務查詢,需要提交。