Database Link (DB Link) 是分散式環境下訪問遠端資料庫的通訊通道,**隱藏遠端連線複雜性**。本地資料庫透過 DB Link 直接引用遠端物件 (表、視圖、Synonym)。
CREATE DATABASE LINK link_name
CONNECT TO remote_user IDENTIFIED BY password
USING 'tns_service_name';
CREATE DATABASE LINK 系統權限USING 參數對應本地 tnsnames.ora 中的服務名
-- 查詢遠端表
SELECT * FROM table_name@link_name;
-- 跨庫 JOIN (分散式查詢)
SELECT e.ename, d.dname
FROM emp@remote_link e, dept d
WHERE e.deptno = d.deptno;
-- 跨庫 DML (需遠端用戶有權限)
INSERT INTO table@link_name SELECT * FROM local_table;
UPDATE table@link_name SET col = val WHERE pk = 1;
DELETE FROM table@link_name WHERE pk = 1;
MYDB_REMOTE (tnsnames.ora)
CONNECT scott/tiger@MYDB_LOCAL
CREATE DATABASE LINK abc
CONNECT TO scott IDENTIFIED BY tiger
USING 'MYDB_REMOTE';
SELECT * FROM emp@abc;
SELECT e.ename, d.dname
FROM emp@abc e, dept d
WHERE e.deptno = d.deptno;
| 類型 | 建立語法 | 適用場景 |
|---|---|---|
| 固定用戶 (Private) | CONNECT TO user IDENTIFIED BY pwd | 應用固定帳號存取遠端,最常用 |
| 當前用戶 (Current User) | CONNECT TO CURRENT_USER | 搭配全域用戶/SSL,免存密碼,安全性高 |
| 公用 | CREATE PUBLIC DATABASE LINK | 所有本地用戶可用,需 CREATE PUBLIC DATABASE LINK 權限 |
| 共用 | SHARED 關鍵字 | 多 Session 共用網路連線,減少遠端 Process |
反模式:應用端抓回大量資料 → 記憶體處理 → 批次 UPDATE 寫回
正模式:單一 SQL 完成跨庫邏輯,資料不出庫
-- 錯誤:抓回 100 萬列 → 迴圈 UPDATE
-- 正確:單一 MERGE / UPDATE 遠端表
MERGE INTO local_table l
USING (SELECT pk, col FROM big_table@remote WHERE cond) r
ON (l.pk = r.pk)
WHEN MATCHED THEN UPDATE SET l.col = r.col;
SELECT /*+ DRIVING_SITE(r) */ *
FROM local_table l, big_table@remote r
WHERE l.pk = r.pk AND r.status = 'ACTIVE';
告訴優化器在遠端站點執行查詢,僅傳回結果集,大幅減少網路傳輸。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-02019: connection description for remote database not found | tnsnames.ora 缺少服務名或拼錯 | 檢查本地 tnsnames.ora、TNS_ADMIN 環境變數 |
| ORA-01017: invalid username/password | DB Link 定義的遠端帳號密碼錯誤/過期 | 重建 DB Link 或 ALTER DATABASE LINK ... CONNECT TO ... |
| ORA-02070: database does not support ... in this context | 遠端版本不支援特定語法 (如 MERGE、XMLTYPE) | 改用相容寫法或升級遠端 |
| 分散式交易失敗 ORA-02049 | 分散式鎖等待逾時 (分散式死鎖) | 縮短交易、避免長交易、檢查 DISTRIBUTED_LOCK_TIMEOUT |
CONNECT TO CURRENT_USER + 全域用戶 (OID/SSL)DBA_DB_LINKS,移除廢棄連結