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

Oracle Database Link (dblink) 與 global_names 參數深度解析:命名、認證與跨庫訪問實戰

     編輯:Oracle 資料庫基礎

核心概念:Global Name = DB_NAME + DB_DOMAIN

Oracle 強制全局唯一標識:GLOBAL_NAME = DB_NAME.DB_DOMAIN。
例:
DB1: DB_NAME=DBA, DB_DOMAIN=WORLD → GLOBAL_NAME=DBA.WORLD
DB2: DB_NAME=ORA9I, DB_DOMAIN=ORACLE.COM → GLOBAL_NAME=ORA9I.ORACLE.COM

global_names 參數:DB Link 命名的開關

global_names 值 (本地庫)DB Link 命名規則典型場景
FALSE (默認) 任意名稱,如 CREATE DATABASE LINK mylink ... 開發/測試環境、單向簡單訪問、異構舊系統
TRUE **必須與遠端庫 GLOBAL_NAME 完全一致** (大小寫不敏感)
CREATE DATABASE LINK "ORA9I.ORACLE.COM" ...
生產環境、雙向複製、Data Guard、Oracle Streams/GoldenGate 前置條件

關鍵點:該參數**僅影響本地庫創建 DB Link 時的命名校驗**,與遠端庫無關。

DB Link 兩大認證模式

模式語法認證來源適用場景
Fixed User (固定用戶) CREATE DATABASE LINK dblink CONNECT TO remote_user IDENTIFIED BY pwd USING 'tns_alias'; DB Link 定義中顯式指定的遠端用戶/密碼 應用統一賬戶訪問、密碼輪換集中管理、跨安全域
Connected User (當前用戶) CREATE DATABASE LINK dblink USING 'tns_alias'; 發起會話的本地用戶同名同密碼映射到遠端 單點登錄 (SSO) 環境、審計需保留原始用戶身份

第三類:CURRENT_USER (存儲過程定義者權限/調用者權限上下文中動態解析),高級安全/細粒度訪問控制場景使用。

四大組合場景實測 (源自原文實驗)


-- 環境: LOCAL (DBA.WORLD) -> REMOTE (ORA9I.ORACLE.COM)
-- TNS alias: 'as3' (LOCAL->REMOTE), 'dba' (REMOTE->LOCAL)

-- 1. global_names=FALSE, Connected User
CREATE DATABASE LINK foo USING 'as3';
SELECT * FROM global_name@foo;  -- 成功返回 ORA9I.ORACLE.COM

-- 2. global_names=FALSE, Fixed User
CREATE DATABASE LINK woo CONNECT TO mhung IDENTIFIED BY huang USING 'as3';
SELECT * FROM global_name@woo;  -- 成功

-- 3. global_names=TRUE, Connected User (舊 link 失效)
ALTER SYSTEM SET global_names=TRUE;
SELECT * FROM global_name@foo;  -- ORA-02085: database link FOO.WORLD connects to ORA9I.ORACLE.COM
-- 必須重建
CREATE DATABASE LINK "ORA9I.ORACLE.COM" USING 'as3';
SELECT * FROM global_name@"ORA9I.ORACLE.COM";  -- 成功

-- 4. global_names=TRUE, Fixed User
CREATE DATABASE LINK "ORA9I.ORACLE.COM" CONNECT TO mhung IDENTIFIED BY huang USING 'as3';

Public vs Private DB Link

  • CREATE PUBLIC DATABASE LINK ...:所有用戶可見,SELECT * FROM table@link 直接用。
  • CREATE DATABASE LINK ... (私有):僅擁有者可見,其他用戶需 owner.link_name。
  • 生產建議:**統一使用 PUBLIC + global_names=TRUE**,配合同義詞屏蔽鏈接名複雜度。

雙向複製環境部署範例


-- ON LOCAL (DBA.WORLD)
ALTER SYSTEM SET global_names=TRUE SCOPE=BOTH;
CREATE PUBLIC DATABASE LINK "ORA9I.ORACLE.COM" USING 'as3';
-- 授權遠端複製用戶
GRANT CREATE SESSION, CREATE TABLE TO repl_user IDENTIFIED BY repl_pwd;

-- ON REMOTE (ORA9I.ORACLE.COM)
ALTER SYSTEM SET global_names=TRUE SCOPE=BOTH;
CREATE PUBLIC DATABASE LINK "DBA.WORLD" USING 'dba';

-- 驗證雙向連通
SELECT * FROM dual@"ORA9I.ORACLE.COM";
SELECT * FROM dual@"DBA.WORLD";

Synonym 封裝最佳實踐


-- 遠端創建同義詞屏蔽 DB Link
CREATE SYNONYM remote_emp FOR scott.emp@"DBA.WORLD";

-- 本地透明訪問
SELECT * FROM remote_emp;  -- 實際走 DB Link

避坑指南

  1. 修改 global_names 後舊 link 失效:必須按新規則重建,建議維護重建腳本。
  2. TNS 別名解析失敗:確保 tnsnames.ora 雙端配置正確,tnsping 通。
  3. 密碼大小寫敏感 (11g+):IDENTIFIED BY 區分大小寫,引號包裹 IDENTIFIED BY "PassWord123"。
  4. DB Link 單向性:A→B 不代表 B→A,雙向需雙邊創建。
  5. 分布式事務 (2PC) 開銷:跨 DB Link DML 觸發兩階段提交,高併發慎用,優先考慮異步複製 (GoldenGate/Kafka)。

總結

DB Link 是 Oracle 跨實例訪問的基石。**global_names=TRUE + PUBLIC DB Link + Fixed User 認證 + Synonym 封裝** 是企業級部署的標準組合。理解命名規則、認證模式、雙向部署邏輯,能避開 90% 的跨庫連接故障。

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