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

Oracle GLOBAL_NAMES 參數深度研究:Database Link 命名規則與跨庫連線實戰

     編輯:Oracle 資料庫基礎

前言

GLOBAL_NAMES 是控制 Database Link(DB Link)命名強制性的關鍵參數。設為 TRUE 時,DB Link 名稱必須與目標資料庫的 GLOBAL_NAME 完全一致。本文透過雙節點實測(Windows XJ ↔ Linux RAC DMDB),系統驗證參數行為、錯誤現象、多連線解決方案與 Schema 權限陷阱。


一、測試環境與基準配置

角色主機/版本GLOBAL_NAME初始 GLOBAL_NAMES
來源庫(發起連線)Windows 2003, 10.2.0.1XJFALSE
目標庫(被連線)Linux AS5 RAC, 10.2.0.1DMDBFALSE

二、參數互動行為完整驗證矩陣

2.1 階段 1:雙方均 FALSE(預設行為)

-- 來源庫 XJ
CREATE DATABASE LINK test_link CONNECT TO test IDENTIFIED BY test USING 'DMDB';
SELECT * FROM dual@test_link;  -- 成功

✅ DB Link 名稱任意,連線正常。

2.2 階段 2:目標庫 DMDB 設 TRUE,來源庫 FALSE

-- 目標庫 DMDB
ALTER SYSTEM SET global_names = TRUE;

-- 來源庫 XJ(未重建 DB Link)
SELECT * FROM dual@test_link;       -- 成功
CREATE DATABASE LINK test_link2 ... -- 成功
SELECT * FROM dual@test_link2;      -- 成功

✅ 目標庫 GLOBAL_NAMES=TRUE 不影響 來源庫現有或新建 DB Link 使用。

2.3 階段 3:來源庫 XJ 設 TRUE(關鍵轉折)

-- 來源庫 XJ
ALTER SYSTEM SET global_names = TRUE;

SELECT * FROM dual@test_link2;  -- ❌ ORA-02085: DB Link TEST_LINK2 連線到 DMDB
SELECT * FROM dual@test_link;   -- ❌ ORA-02085

❌ 來源庫 GLOBAL_NAMES=TRUE 導致所有指向 DMDB 的 DB Link 必須命名為 DMDB,否則報錯。

2.4 階段 4:來源庫改回 FALSE 恢復正常

ALTER SYSTEM SET global_names = FALSE;
SELECT * FROM dual@test_link;    -- 成功

2.5 階段 5:目標庫改回 FALSE,連線仍正常

驗證結論:只有發起連線那一端的 GLOBAL_NAMES 參數生效。


三、核心結論總結

GLOBAL_NAMES=TRUE 的強制效力,僅作用於「建立並使用 DB Link 的那個資料庫實例」。
若來源庫設 TRUE,則該來源庫建立的所有 DB Link,名稱必須等於目標資料庫的 GLOBAL_NAME。


四、實戰難題:同一目標庫需建立多條 DB Link 如何解決?

場景:來源庫 GLOBAL_NAMES=TRUE,需建立多條連往同一目標庫(如不同用戶、不同網路路徑、不同服務名稱)的 DB Link,但名稱都必須叫 DMDB,會衝突。

4.1 解決方案:使用「@連線限定符」語法

-- 來源庫 XJ (GLOBAL_NAMES=TRUE)
CREATE DATABASE LINK "DMDB@LINK1" CONNECT TO test IDENTIFIED BY test USING 'dmdb';
CREATE DATABASE LINK "DMDB@LINK2" CONNECT TO test2 IDENTIFIED BY test2 USING 'dmdb';

-- 使用時
SELECT * FROM dual@"DMDB@LINK1";
SELECT * FROM dual@"DMDB@LINK2";
  • 雙引號保留大小寫與特殊字元。
  • 語法:GLOBAL_NAME@CONNECT_QUALIFIER,其中 CONNECT_QUALIFIER 可任意自訂。
  • 資料字典 DBA_DB_LINKS 中 DB_LINK 欄位顯示為 DMDB@LINK1,HOST 欄位仍為服務名稱 dmdb。

五、進階陷阱:跨 Schema 建立 DB Link 的權限誤區

嘗試以 A 用戶為 B 用戶建立 DB Link:

-- A 用戶執行
CREATE DATABASE LINK B.LINKB CONNECT TO ... USING ...;

結果:實際建立的是 A 用戶下名為 B.LINKB 的 DB Link,而非 B 用戶的物件。因 DB Link 名稱允許含點號(.),Oracle 視為單一物件名稱,不解析為 Schema.物件。

正確做法

  1. 以目標 Schema 用戶登入建立。
  2. 或授予 CREATE DATABASE LINK 權限給目標用戶,由其自行建立。
  3. 公共 DB Link:CREATE PUBLIC DATABASE LINK ...(需 CREATE PUBLIC DATABASE LINK 系統權限)。

六、最佳實踐建議

  1. 統一規範:企業級環境建議全域設定 GLOBAL_NAMES=TRUE,強制 DB Link 命名與 GLOBAL_NAME 一致,利於治理與審計。
  2. GLOBAL_NAME 規劃:採用 DB_NAME.DOMAIN 格式(如 PROD.ORACLE.COM),避免跨環境衝突。
  3. 多連線需求:善用 @QUALIFIER 語法,避免為繞過限制而設 FALSE。
  4. 權限最小化:僅授予必要用戶 CREATE DATABASE LINK,嚴控 CREATE PUBLIC DATABASE LINK。

七、快速查詢腳本

-- 查看當前庫 GLOBAL_NAME 與參數
SELECT * FROM global_name;
SHOW PARAMETER global_names;

-- 查看所有 DB Link 詳細資訊
SELECT owner, db_link, username, host, created
FROM dba_db_links
ORDER BY owner, db_link;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved