Oracle Transparent Gateway for SQL Server (TG4MSQL) 採用 **一個 Listener、多個 SID、多個 init.ora** 架構,每個 SQL Server 資料庫對應一組獨立配置。
假設新增 SQL Server 資料庫 TARGET_DB,主機 SQL_HOST,復原帳號 RECOVER/RECOVER。
%ORACLE_HOME%\tg4msql\admin\init.ora HS_FDS_CONNECT_INFO = "SERVER=SQL_HOST;DATABASE=TARGET_DB"
HS_DB_NAME = TARGET_DB
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_RECOVERY_ACCOUNT = RECOVER
HS_FDS_RECOVERY_PWD = RECOVER
listener.ora 追加 SID_DESCSID_LIST_LISTENER =
(SID_LIST =
...既有條目...
(SID_DESC =
(SID_NAME = TARGET_DB)
(ORACLE_HOME = )
(PROGRAM = tg4msql)
)
)
**重啟 Listener**:lsnrctl reload 或服務重啟。
tnsnames.ora 追加條目TARGET_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
(CONNECT_DATA = (SID = TARGET_DB))
(HS = TARGET_DB)
)
tnsping TARGET_DB -- OK 即成功
ALTER SYSTEM SET GLOBAL_NAMES = FALSE SCOPE = BOTH; -- 僅需執行一次
CREATE PUBLIC DATABASE LINK TARGET_DB
CONNECT TO IDENTIFIED BY
USING 'TARGET_DB';
| 配置項 | init.ora | listener.ora | tnsnames.ora | DB Link |
|---|---|---|---|---|
| SID / HS_DB_NAME | HS_DB_NAME = TARGET_DB | SID_NAME = TARGET_DB | SID = TARGET_DB HS = TARGET_DB | USING 'TARGET_DB' |
| PROGRAM | — | tg4msql | — | — |
| HS_FDS_CONNECT_INFO | SERVER=...;DATABASE=TARGET_DB | — | — | — |
**四處名稱完全一致** 是 90% 連不上問題的根因。
SQL Server 物件在 Oracle 端呈現為區分大小寫的雙引號識別符。
-- 錯誤
SELECT col FROM tbl@TARGET_DB;
-- 正確
SELECT "col" FROM "tbl"@TARGET_DB;
-- 最佳實踐:建立本地視圖轉換
CREATE OR REPLACE VIEW v_target_tbl AS
SELECT "col1" AS col1, "col2" AS col2 FROM "tbl"@TARGET_DB;
-- 應用層只查視圖,屏蔽異構細節
SELECT col1, col2 FROM v_target_tbl WHERE col1 = :val;
HS_FDS_FETCH_ROWS = 500 -- 每次網路往返抓取行數(預設 100)
HS_LONG_PIECE_TRANSFER_SIZE = 65536 -- LONG/LOB 片段傳輸大小
HS_NLS_NCHAR = UCS2 -- 字元集協商(視 SQL Server 校對集)
HS_FDS_REPORT_REAL_AS_DOUBLE = TRUE -- REAL 型別映射為 DOUBLE PRECISION
sysadmin 或足夠權限。HS_FDS_RECOVERY_ACCOUNT/PWD。DISTRIBUTED_TRANSACTIONS ≥ 最大並行分散式交易數。SET TRANSACTION USE ROLLBACK SEGMENT 或依賴 AUM。#!/bin/bash
# add_sqlserver_db.sh TARGET_DB SQL_HOST SQL_USER SQL_PWD
TARGET_DB=$1; SQL_HOST=$2; SQL_USER=$3; SQL_PWD=$4
ORACLE_HOME=/u01/app/oracle/product/19c
# 1. init.ora
cat > $ORACLE_HOME/tg4msql/admin/init${TARGET_DB}.ora <
Transparent Gateway 多實例部署的核心是 **「四處名稱一致」**。將配置參數化、腳本化、清單化,即可實現「新增 SQL Server 資料庫 = 執行一鍵腳本 + 兩條手工命令」的標準化交付。搭配本地視圖屏蔽雙引號識別符、調優 HS_FDS_FETCH_ROWS、啟用分散式交易,即可構建穩健、高效、可維運的異構查詢中樞。