因專案需求接觸 Oracle 分散式資料庫功能,記錄學習過程中 Database Link 的建立方式、踩過的坑與解決方案,供後續參考。
CREATE PUBLIC DATABASE LINK dbs2 USING 'dbs2';
適用場景:雙方資料庫使用者/密碼相同,或已在 TNS 設定中包含認證資訊。
CREATE PUBLIC DATABASE LINK dbs3
CONNECT TO admin IDENTIFIED BY "000"
USING 'dbs3';
關鍵差異: 明確指定遠端登入帳密,不依賴本地認證映射,安全性更高。
錯誤訊息: ORA-02085: database link DBS2 connects to ORCL
原因: 遠端資料庫的 GLOBAL_NAME 與本地 DB Link 名稱不一致,且本地參數 global_names=TRUE(預設)。
解決:
-- 方法 1:修改本地參數(需重啟)
ALTER SYSTEM SET global_names = FALSE SCOPE=SPFILE;
-- 重啟資料庫
-- 方法 2:讓 DB Link 名稱 = 遠端 GLOBAL_NAME(推薦)
-- 查詢遠端 GLOBAL_NAME
SELECT * FROM global_name@remote_link;
-- 重建同名 DB Link
現象: 本機 tnsnames.ora 有設定,但連線失敗。
原因: 服務名只在本機定義,遠端伺服器的 Listener 不知道此服務名。
解決: 在遠端資料庫伺服器的 listener.ora 註冊該服務,或確認 SERVICE_NAMES 參數包含該名稱,並重載 Listener:
-- 遠端伺服器執行
lsnrctl reload
-- 或重啟
lsnrctl stop && lsnrctl start
-- 簡單查詢
SELECT * FROM t_3@dbs2;
-- 跨庫 JOIN
SELECT a.id, a.name, b.dept_name
FROM local_table a
JOIN remote_table@dbs3 b ON a.dept_id = b.dept_id;
-- 跨庫 DML(需遠端有權限)
INSERT INTO remote_table@dbs3 (id, name) VALUES (1, 'test');
COMMIT;
DBL_<環境>_<用途>,如 DBL_PROD_REPORTSQLNET.EXPIRE_TIME 防止防火牆斷開SELECT * FROM dba_db_links; -- 所有 DB Link
SELECT * FROM v$dblink; -- 當前 Session 開啟的 DB Link
SELECT * FROM user_db_links; -- 當前使用者的 DB Link
tnsping 驗證網路,再用 sqlplus user/pass@tns_alias 驗證認證,最後才建 DB LinkOracle Database Link 是分散式查詢的基石。核心要點三個:
掌握這三點,分散式資料庫應用即可穩健落地。