學習ORACLE-數據庫鏈接(DBLINK)

工作中接觸到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更新遠程庫表上的數據時,會在遠程庫創建會話並在表上加鎖、查詢也是分佈式的事務查詢,需要提交。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章