在ORACLE里面,遠程數據訪問,像查詢、更新等可以通過Database Link來實現。數據庫連接需要在建立Database Link的兩台機子上都運行Oracle Net(以前叫SQL*NET 和NET 8)。 語法如下
1 Database Link 的創建:
有兩個數據庫服務器A/B, 其中A的IP地址為172.20.36.245, 服務器B為本機。服務器B上的數據庫實例名為ORCL,在本機上的服務監聽配置上有服務器A上實例配置:
BIWG_TEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.36.245)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = biwg) ) )
實例BIWG_TEST的賬號為 WGODS 、 密碼為WGODS。下面開始在本機上創建DB Links
方法1:
CREATE [PUBLIC] DATABASE LINK 數據庫鏈接名 CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING '本地配置的數據的實例名';
[public]的意思是:public是全局db link,即該數據庫上所有用戶都能查詢,要sys或者system用戶來創建(當然有sysdba權限的用戶也可以的);如果不使用public就是私有db link,只有創建該db link的用戶能查詢
查看連接是否成功
方法2:可以不配置服務。
CREATE PUBLIC DATABASE LINK REMOTE_DEVE_HOST CONNECT TO WGODS IDENTIFIED BY WGODS USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.36.245)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = biwg) ) )'
不建議使用這個實現。感覺沒有上面方法來的方便
查看連接是否成功
2 查看當前數據有哪些Database Link?
3 如何返回數據庫的GLOBAL_NAME?
SQL> SHOW PARAMETER GLOBAL_NAME; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ global_names boolean FALSE 或 SELECT * FROM GLOBAL_NAME
該參數為TRUE時,你在本地建立的DBLINK名稱必須和遠程的GLOBAL_NAME一致才行。
4 刪除Database Link
DROP [PUBLIC] DATABASE LINK REMOTE_DEVE_HOST;
會報如下錯誤: ORA-02024: 未找到數據庫連接
DROP PUBLIC DATABASE LINK REMOTE_DEVE_HOST;
正常執行刪除Database Link。
5 設置GLOBAL_NAME值對Database Link的影響
SQL> ALTER SYSTEM SET GLOBAL_NAMES = TRUE;
System altered
CREATE PUBLIC DATABASE LINK REMOTE_DB
CONNECT TO WGODS IDENTIFIED BY WGODS USING 'BIWG'
SELECT * FROM DUAL@REMOTE_DB
此時報錯:ORA-02085:數據庫連接 XXXX 到 XXXX
SQL> ALTER SYSTEM SET GLOBAL_NAMES = FALSE;
System altered
修改參數值為FALSE后,查詢就正常了、
6 在DB Link中執行查詢會有些限制。你應該避免使用connect by, start with, 以及prior關鍵字。一些查詢使用了這些關鍵字會很正常, 但是大部分查詢會失敗
7 如何查詢
SELECT …… FROM 表名@數據庫鏈接名
8 DB LINK的使用原則(工作中以及網上收集整理的,僅供參考)
8.1.生產盡量不要使用db link,雖然方便,但這樣不利於數據庫安全管理
8.2.在10g中,BLOB,CLOB在db link中是查不到的,含這種數據類型的,要配合建view使用
8.3.我們經常可以使用synonym來做一些配置,以提高易讀性和安全性
8.4.被建立了db link的user,最好不要修改密碼,若修改密碼要重建db link
8.5.db link是單向的
8.6 數據庫鏈接名,建議使用SID.SCHEMA的形式,這樣方便有多個db link時的識別(建議,個人習慣,非強制性)