首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Database Link 完整實作:類型、認證模式、同義詞封裝與異構連線

     編輯:Oracle 資料庫基礎

前言:跨資料庫存取的標準化通道

Database Link (DB Link) 是 Oracle 實現分散式查詢的核心機制,讓本地會話透明存取遠端資料庫物件。本文系統梳理 DB Link 的三種認證模式、三種可見性層級、建立語法、同義詞封裝最佳實踐,並延伸至 Oracle Gateway 異構連線(MySQL、SQL Server、PostgreSQL 等)。

一、 核心分類矩陣

維度類型說明典型場景
認證模式Connected User使用當前登入使用者同帳號/密碼連線遠端開發/測試環境、帳號同步的同質環境
Fixed User指定遠端專用帳號/密碼(儲存於 DB Link 定義中)生產環境標準、權限最小化、審計追蹤清晰
Current User全域使用者(Enterprise User Security),憑證/目錄驗證,不儲存密碼高安全合規、OID/OUD 整合、雲端部署
可見性PRIVATE僅擁有者可用,預設個人工具、特定應用專用
PUBLIC本資料庫所有使用者可用共用服務、報表平台、中介軟體連線池
GLOBAL目錄服務(OID/OUD)管理,網域內所有資料庫自動同步企業級統一存取控制、雲端多租戶

二、 建立語法完整指南

1. 基礎:使用 TNS 別名

-- Private Fixed User(最常用生產模式)
CREATE DATABASE LINK sales_link
  CONNECT TO sales_ro IDENTIFIED BY "ComplexPass"
  USING 'SALES_TNS';

-- Public Connected User
CREATE PUBLIC DATABASE LINK dev_link
  CONNECT TO CURRENT_USER
  USING 'DEV_TNS';

2. 進階:硬編碼連線描述(無需 tnsnames.ora)

CREATE DATABASE LINK dw_link
  CONNECT TO etl_user IDENTIFIED BY "Pass"
  USING '(DESCRIPTION=
    (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=dw-scan.example.com)(PORT=1521)))
    (CONNECT_DATA=(SERVICE_NAME=DW_SVC)))';

3. Current User + Global(需 EUS 環境)

-- 目錄中已註冊 GLOBAL DB LINK,本地無需建立
-- 使用者以全域身分登入:sqlplus 'user@domain.com'@DB

三、 同義詞封裝:隱藏分散式細節

直接在 SQL 中寫 SELECT * FROM orders@sales_link 違反封裝原則,應建立同義詞:

-- 私有同義詞(僅擁有者可見)
CREATE SYNONYM sales_orders FOR orders@sales_link;

-- 公用同義詞(全資料庫可見,需 CREATE PUBLIC SYNONYM 權限)
CREATE PUBLIC SYNONYM sales_orders FOR orders@sales_link;

支援物件類型

  • TABLE / VIEW / MATERIALIZED VIEW
  • SEQUENCE / PROCEDURE / FUNCTION / PACKAGE / TYPE
  • 另一 DB Link(鏈式,不推薦超過 2 層)

應用層呼叫

-- 完全透明,無感知遠端
SELECT order_id, cust_id, total_amt
FROM sales_orders
WHERE order_date > SYSDATE - 7;  -- 遠端執行篩選,僅傳回結果集

四、 異構連線:Oracle Gateway 實戰

透過 Oracle Database Gateway 連接非 Oracle 資料源(MySQL、SQL Server、PostgreSQL、MongoDB 等)。

架構組件

  1. Gateway Agent:安裝於目標資料庫同主機或獨立主機
  2. Listener.ora:註冊 SID_LIST_LISTENER 指向 Gateway SID
  3. Tnsnames.ora:本地定義指向 Gateway Listener 的服務名
  4. DB Link:連線至 Gateway 服務

MySQL 範例配置

-- 1. Gateway 初始化參數 (initsid.ora)
HS_FDS_CONNECT_INFO = mysql_host:3306/sales_db
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmysqlclient.so
HS_LANGUAGE = AL32UTF8

-- 2. Listener.ora (Gateway 主機)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = dg4mysql)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = dg4mysql)
      (ENVS = "LD_LIBRARY_PATH=/usr/lib64")
    )
  )

-- 3. 本地 tnsnames.ora
MYSQL_SALES = (DESCRIPTION=
  (ADDRESS=(PROTOCOL=TCP)(HOST=gateway_host)(PORT=1521))
  (CONNECT_DATA=(SID=dg4mysql))
  (HS=OK))

-- 4. 建立 DB Link
CREATE DATABASE LINK mysql_sales_link
  CONNECT TO "mysql_user" IDENTIFIED BY "mysql_pass"
  USING 'MYSQL_SALES';

-- 5. 查詢(自動轉換資料型別、SQL 方言)
SELECT * FROM orders@mysql_sales_link WHERE status = 'SHIPPED';

關鍵限制

  • DDL 不支援(無法遠端 CREATE TABLE)
  • 交易一致性:Gateway 不支援兩階段提交,遠端 DML 屬於獨立交易
  • 效能:大量資料建議用 INSERT /*+ APPEND */ INTO local_tbl SELECT * FROM remote_tbl@link 或 GoldenGate/CDC
  • 字元集轉換:確保 HS_LANGUAGE 與目標 DB 字元集相容

五、 安全與審計強化

  1. 專用帳號:遠端建立唯讀/最小權限帳號,密碼定期輪換
  2. 密碼加密:12c+ 支援 IDENTIFIED BY VALUES 'encrypted_hash' 避免明文
  3. 網路加密:SQLNET.ENCRYPTION_SERVER = REQUIRED、SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
  4. 審計:AUDIT DATABASE LINK 記錄建立/使用/刪除操作
  5. 防火牆:僅開放 Gateway Listener Port 至應用/資料庫段

六、 疑難排查速查表

錯誤原因解決
ORA-02019: connection description for remote database not foundUSING 字串錯誤 / tnsnames.ora 未找到檢查 TNS 別名拼寫、tnsping 測試
ORA-01017: invalid username/password遠端帳號密碼錯誤 / 大小寫敏感(12c+)確認遠端帳號狀態、密碼、SEC_CASE_SENSITIVE_LOGON
ORA-02085: database link ... connects to ...DB Link 連線目標與 GLOBAL_NAMES 不符ALTER SYSTEM SET global_names=FALSE 或確保遠端 DB_NAME=DB_LINK 名稱
ORA-28545: error diagnosed by Net8 when connecting to an agentGateway Agent 未啟動 / Listener 未註冊 SID檢查 lsnrctl status、Gateway 進程、initsid.ora 路徑
ORA-02070: database does not support ... in this context遠端版本/功能不支援(如舊版不支援 XMLTYPE)改用視圖轉換、或升級遠端

Database Link 是分散式架構的基石,設計原則:專用帳號、同義詞封裝、監控延遲、限制 DML 範圍。異構場景優先評估 CDC/複製技術,保留 DB Link 做即時小量查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved