Database Link(DBLink)是 Oracle 實現分布式數據庫訪問的核心對象,提供邏輯透明性:應用無需感知網絡拓撲、數據分佈、協議細節,像訪問本地表一樣訪問遠程表。
| 類型 | 創建語法 | 可見性 | 適用場景 |
|---|---|---|---|
| 私有 | CREATE DATABASE LINK link_name CONNECT TO user IDENTIFIED BY pwd USING 'tns_alias'; | 僅創建者 | 應用專用連接、憑證隔離 |
| 公共 | CREATE PUBLIC DATABASE LINK link_name CONNECT TO user IDENTIFIED BY pwd USING 'tns_alias'; | 所有用戶 | 共享服務、報表、ETL |
| 當前用戶 | CREATE [PUBLIC] DATABASE LINK link_name USING 'tns_alias'; | 按當前用戶映射 | 企業用戶、全局認證、SSL |
| GLOBAL_NAMES | DBLink 命名要求 | 示例 |
|---|---|---|
| FALSE(默認) | 任意合法名稱 | CREATE DATABASE LINK SH_LINK ... |
| TRUE | 必須等於遠程數據庫 GLOBAL_NAME | CREATE DATABASE LINK SH.TEST.COM.CN ... |
查看全局名:SELECT * FROM GLOBAL_NAME;
修改全局名:ALTER DATABASE RENAME GLOBAL_NAME TO new_name;(需重啟或 ALTER SYSTEM 刷新)
-- TNSNAMES.ORA
SH = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.0.100)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=SH)))
-- 創建公共 DBLink
CREATE PUBLIC DATABASE LINK SH.TEST.COM.CN
CONNECT TO SCOTT IDENTIFIED BY TIGER
USING 'SH';
CREATE DATABASE LINK SH_LINK
CONNECT TO SCOTT IDENTIFIED BY TIGER
USING '(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.0.100)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=SH))
)';
優點:不依賴客戶端 TNS 配置,部署簡單;缺點:IP 變更需重建 DBLink。
CREATE DATABASE LINK 系統權限(含於 CONNECT/RESOURCE)CREATE PUBLIC DATABASE LINK(僅 DBA 擁有)CREATE SESSION 權限-- 直接引用
SELECT * FROM EMP@SH_LINK;
-- 跨 Schema(遠程用戶非對象擁有者)
SELECT * FROM HR.EMPLOYEES@SH_LINK;
-- DML 操作
INSERT INTO DEPT@SH_LINK VALUES (50, 'IT', 'BEIJING');
UPDATE EMP@SH_LINK SET SAL = SAL * 1.1 WHERE DEPTNO = 10;
DELETE FROM EMP@SH_LINK WHERE EMPNO = 9999;
-- 同義詞(私有/公共)
CREATE SYNONYM EMP_SH FOR EMP@SH_LINK;
CREATE PUBLIC SYNONYM EMP_SH FOR EMP@SH_LINK;
-- 視圖(可加 WHERE 過濾、列投影、權限控制)
CREATE VIEW V_EMP_SH AS
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP@SH_LINK WHERE DEPTNO = 20;
-- 授權視圖而非底層 DBLink
GRANT SELECT ON V_EMP_SH TO REPORT_USER;
| 原則 | 說明 | 示例 |
|---|---|---|
| 驅動站點提示 | 強制在遠程執行連接,減少網絡傳輸 | SELECT /*+ DRIVING_SITE(r) */ * FROM LOCAL l, REMOTE@LINK r WHERE l.ID = r.ID |
| 遠程過濾下推 | WHERE 條件盡量在遠程執行 | 避免 WHERE LOCAL_COL = REMOTE_COL@LINK 導致全表拉回 |
| 物化視圖預聚合 | 大表聚合先在遠程物化視圖完成 | CREATE MATERIALIZED VIEW MV_SALES@LINK ... |
| 避免分布式 DDL | 遠程 DDL 隱式提交,易導致事務不一致 | 本地建表,遠程只做 DML |
| 事務一致性 | 分布式事務用兩階段提交,性能代價大 | 業務允許時用異步復制/Goldengate 替代 |
| 錯誤代碼 | 原因 | 解決 |
|---|---|---|
| ORA-02019 | 遠程數據庫未找到 | 檢查 TNS 別名、服務名、監聽狀態 |
| ORA-02085 | GLOBAL_NAMES=TRUE 但 DBLink 名≠遠程 GLOBAL_NAME | 重建 DBLink 名為遠程 GLOBAL_NAME |
| ORA-01017 | 遠程用戶/密碼錯誤 | 驗證遠程用戶狀態、密碼、大小寫 |
| ORA-02068 | 分布式事務需兩階段提交不支持 | 拆分事務或用 AUTONOMOUS_TRANSACTION |
| ORA-12154 | TNS 無法解析 | 檢查 TNSNAMES.ORA 路徑、拼寫、NAMES.DIRECTORY_PATH |
-- 查看所有 DBLink
SELECT OWNER, DB_LINK, USERNAME, HOST, CREATED FROM DBA_DB_LINKS;
-- 測試連通性
SELECT * FROM DUAL@LINK_NAME;
-- 刪除
DROP [PUBLIC] DATABASE LINK LINK_NAME;
DBA_DB_LINKS、V$DBLINK 連接數