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

Oracle 透明網關實戰:單實例同時訪問多個 SQL Server 資料庫

     編輯:Oracle 資料庫基礎

場景與架構

需在 Oracle 9i/10g 中透過 Heterogeneous Services (HS) 透明網關,同步訪問 SQL Server 的 pubs 與 Northwind 兩個資料庫。架構:

Oracle Server (192.168.0.1)  ←── DB Link ──→  Gateway Server (192.168.0.2, Windows)
                                                                      │
                                                          ┌───────────┴───────────┐
                                                          ▼                       ▼
                                                    SQL Server: pubs          SQL Server: Northwind

一、網關端配置 (Windows, IP 192.168.0.2)

1.1 安裝選項

Oracle 9i Standard/Enterprise Edition 安裝時勾選 Oracle Transparent Gateway for Microsoft SQL Server。

1.2 初始化參數文件 ($ORACLE_HOME\tg4msql\admin\)

為每個目標資料庫建立獨立 init.ora:

-- initpubs.ora
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=pubs"
HS_DB_NAME=pubs
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

-- initnorthwind.ora
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind"
HS_DB_NAME=Northwind
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

1.3 監聽器配置 ($ORACLE_HOME\network\admin\listener.ora)

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = (GLOBAL_DBNAME=test9)(ORACLE_HOME=d:\oracle\ora92)(SID_NAME=test9))
    (SID_DESC = (SID_NAME=pubs)(ORACLE_HOME=d:\Oracle\Ora92)(PROGRAM=tg4msql))
    (SID_DESC = (SID_NAME=northwind)(ORACLE_HOME=d:\Oracle\Ora92)(PROGRAM=tg4msql))
  )

關鍵點:PROGRAM=tg4msql 指定網關程式;每新增一個 SQL Server 資料庫,必須在 SID_LIST 新增對應 SID_DESC 並 重啟 TNSListener 服務。

二、Oracle 服務端配置 (Unix/Windows)

2.1 tnsnames.ora 定義服務名

pubs =
  (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
    (CONNECT_DATA = (SID=pubs))
    (HS=pubs)
  )

northwind =
  (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.2)(PORT=1521)))
    (CONNECT_DATA = (SID=northwind))
    (HS=northwind)
  )

2.2 連通性測試

$ tnsping pubs
$ tnsping northwind
-- 均顯示 OK (XX 毫秒) 即成功

2.3 關鍵參數:GLOBAL_NAMES=FALSE

預設 TRUE 要求 DB Link 名稱與遠端全域名一致,設為 FALSE 可自由命名:

ALTER SYSTEM SET GLOBAL_NAMES=FALSE;
-- 或會話級:ALTER SESSION SET GLOBAL_NAMES=FALSE;

2.4 建立公共 DB Link

CREATE PUBLIC DATABASE LINK pubs
  CONNECT TO testuser IDENTIFIED BY testuser_pwd USING 'pubs';

CREATE PUBLIC DATABASE LINK northwind
  CONNECT TO testuser IDENTIFIED BY testuser_pwd USING 'northwind';
-- 假設 SQL Server 兩庫均存在 testuser/testuser_pwd 且權限足夠

三、跨庫查詢與遷移實戰

3.1 直接查詢

SELECT * FROM stores@pubs;
SELECT * FROM region@northwind;

3.2 遷移建表 (CTAS) 陷阱:雙引號識別符

Oracle 透過網關拉取 SQL Server 中繼數據時,欄位名帶雙引號 (大小寫敏感):

CREATE TABLE stores AS SELECT * FROM stores@pubs;
SELECT zip FROM stores;           -- ORA-00904: 無效列名
SELECT "zip" FROM stores;         -- 正確,需雙引號

檢視遷移後 DDL:

CREATE TABLE stores
(
  "stor_id"     CHAR(4) NOT NULL,
  "stor_name"   VARCHAR2(40),
  "stor_address" VARCHAR2(40),
  "city"        VARCHAR2(20),
  "state"       CHAR(2),
  "zip"         CHAR(5)
) ...;

最佳實踐:遷移後立即重命名欄位移除雙引號,或建立不帶引號的視圖/同義詞供應用層使用。

四、配置清單速查 (部署核對用)

位置文件/項目關鍵一致性要求
Gateway Server$OH\tg4msql\admin\init<SID>.oraHS_DB_NAME = SID_NAME
Gateway Serverlistener.ora → SID_LISTSID_NAME = init<SID>.ora 同名;PROGRAM=tg4msql
Oracle Servertnsnames.oraSID = Gateway SID_NAME;HS = 同值
Oracle ServerDB Link USING 子句引用 tnsnames.ora 服務名

結語

Oracle Transparent Gateway + Heterogeneous Services 實現了異構資料庫的無縫整合。關鍵在於:網關端每個目標庫獨立 init.ora + listener.ora 註冊 SID、Oracle 端 tnsnames.ora 對應 HS 服務名、GLOBAL_NAMES=FALSE 解除命名綁定、雙引號識別符遷移後處理。按清單核對,一次成功。

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