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)管理,網域內所有資料庫自動同步 | 企業級統一存取控制、雲端多租戶 |
-- 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';
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)))';
-- 目錄中已註冊 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;
-- 完全透明,無感知遠端
SELECT order_id, cust_id, total_amt
FROM sales_orders
WHERE order_date > SYSDATE - 7; -- 遠端執行篩選,僅傳回結果集
透過 Oracle Database Gateway 連接非 Oracle 資料源(MySQL、SQL Server、PostgreSQL、MongoDB 等)。
SID_LIST_LISTENER 指向 Gateway SID-- 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';
CREATE TABLE)INSERT /*+ APPEND */ INTO local_tbl SELECT * FROM remote_tbl@link 或 GoldenGate/CDCHS_LANGUAGE 與目標 DB 字元集相容IDENTIFIED BY VALUES 'encrypted_hash' 避免明文SQLNET.ENCRYPTION_SERVER = REQUIRED、SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)AUDIT DATABASE LINK 記錄建立/使用/刪除操作| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-02019: connection description for remote database not found | USING 字串錯誤 / 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 agent | Gateway Agent 未啟動 / Listener 未註冊 SID | 檢查 lsnrctl status、Gateway 進程、initsid.ora 路徑 |
| ORA-02070: database does not support ... in this context | 遠端版本/功能不支援(如舊版不支援 XMLTYPE) | 改用視圖轉換、或升級遠端 |
Database Link 是分散式架構的基石,設計原則:專用帳號、同義詞封裝、監控延遲、限制 DML 範圍。異構場景優先評估 CDC/複製技術,保留 DB Link 做即時小量查詢。