dg4msql配置关键在于SID名、HS=OK、监听端口及HS_FDS_CONNECT_INFO格式四点对齐:SID名须与init文件名一致;HS_FDS_CONNECT_INFO需用IP+端口+数据库名(如[192.168.10.20]:1433//AdventureWorks);listener.ora配网关机,tnsnames.ora配Oracle服务器;(HS=OK)不可缺;推荐直接在DBLink中嵌入连接描述符并启用trace定位问题。
dg4msql 是 oracle 透明网关访问 sql server 的核心可执行程序,配置失败通常不是因为步骤漏了,而是几个关键点没对齐——比如 sid 名、监听端口、hs=ok 标识、或 hs_fds_connect_info 格式写错。下面直接说清楚怎么做、为什么这么设、以及最容易卡住的地方。
确认透明网关安装位置和 SID 名称
安装后必须找到 tg4msql 目录(如 C:\app\Administrator\product\11.2.0\tg_1\tg4msql),里面 admin 子目录下的初始化文件名决定了后续所有配置的 SID 名:
– 文件名是 initdg4msql.ora → SID 必须是 dg4msql
– 文件名是 initsql2000.ora → SID 必须是 sql2000
– 这个 SID 会同时出现在 listener.ora 的 SID_NAME 和 tnsnames.ora 的 SID 字段里,三处不一致必连不上
写对 HS_FDS_CONNECT_INFO 格式
这个参数是连接 SQL Server 的“地址+端口+数据库”的组合,格式严格,且不同 Oracle 版本略有差异:
– Oracle 11g/12c 推荐用: HS_FDS_CONNECT_INFO=[192.168.10.20]:1433//AdventureWorks
– 方括号表示 IPv4 地址(避免 DNS 解析问题),冒号后是端口,双斜杠后是数据库名
– 不要用 localhost 或 127.0.0.1(网关进程在远程机器上运行时会解析成自己,导致连错)
– 如果 SQL Server 启用了命名实例(如 SQLSERVER2019\INST1),不能直接填实例名;需确保 SQL Server Browser 服务开启,并在 HS_FDS_CONNECT_INFO 中省略实例名,靠端口识别(或改用 TCP 端口直连)
tnsnames.ora 和 listener.ora 必须分机器配
这是最常被搞混的一点:网关监听器(listener.ora)必须配在**网关所在机器**(通常是 SQL Server 所在服务器),而客户端的 tnsnames.ora 必须配在**Oracle 数据库服务器**上:
– 网关机器上的 listener.ora 要包含:SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = dg4msql) (ORACLE_HOME = C:\app\Administrator\product\11.2.0\tg_1) (PROGRAM = dg4msql)))
– Oracle 服务器上的 tnsnames.ora 要包含:dg4msql = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.20)(PORT = 1521)) (CONNECT_DATA = (SID = dg4msql)) (HS = OK))
– 注意:(HS = OK) 缺失会导致 ORA-28545 错误;HOST 填的是网关机器的 IP,不是 SQL Server 的 IP(除非两者同机)
创建 DBLink 时绕过 tnsnames.ora 的写法更可靠
很多环境里 tnsnames.ora 配置容易出错,不如直接在 CREATE DATABASE LINK 里嵌入连接描述符:
CREATE DATABASE LINK sqlserver_link
CONNECT TO "sa" IDENTIFIED BY "MyPass123"
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.10.20)(PORT=1521))
(CONNECT_DATA=(SID=dg4msql))(HS=OK))';
– 这样就跳过了 Oracle 服务器本地 tnsnames.ora 查找环节– 用户名密码必须用双引号包裹(尤其
sa 这类全小写账户,Oracle 默认转大写)– 测试前先用
tnsping dg4msql(在 Oracle 服务器上执行)验证网络层通不通,再查 SELECT * FROM dual@sqlserver_link
实际部署中,HS_FDS_TRACE_LEVEL=ON 开启后生成的 trace 文件(默认在 $ORACLE_HOME/tg4msql/log)比任何文档都管用——它会明确告诉你卡在哪一步:是连不上 SQL Server,还是认证失败,或是数据类型映射报错。别跳过这步。


















