
简介面向需要在 Linux x86-64 平台部署 Oracle Database Gateways 11gR211.2.0.1.0的 DBA、运维与系统集成人员该压缩包提供完整的网关组件及配套文件用于打通 Oracle 与异构数据源之间的访问通道解决跨平台数据集成与中间件配置难题。压缩包共 1502 个文件总大小约 633.57MB主体为 jar 程序库、htm 帮助页面和 gif 示意图同时包含 db 类型文件、sh 配置脚本、properties/rsp 参数文件、pdf 手册与 nls 语言资源覆盖安装部署、参数配置、文档查阅和排错参考等常用场景。资源附带安装响应文件、环境校验脚本、备份文件及索引清单便于快速了解 Gateway 组件构成和初始配置流程。目前已有 690 人学习下载适合具备一定 Oracle 基础、准备搭建 11gR2 Gateway 实验环境或进行生产评估的技术人员参考。1. 这个 zip 包到底解决什么问题做过跨数据库数据同步的人都知道最难受的不是写代码而是让 Oracle 和 SQL Server 之间像本地表一样互相查询。某系统集成项目里报表库是 Oracle 11gR2业务库在 SQL Server 上两边数据要实时核对。最初方案是每天跑 ETL 脚本导出导入结果次日凌晨的批处理经常因为数据量波动失败领导一句为什么不能直接查把问题抛了回来。这时候就是linux.x64_11gR2_gateways.zip出场的时候它装的是 Oracle 异构网关Heterogeneous Gateway装完后 SQL Server 的表在 Oracle 里可以当作远程表来查不需要中间表、不需要双写、不需要开发一套同步程序。适合的人群很明确手里有 Oracle 11gR2、又需要直连异构数据库做查询或移植的 DBA 和负责系统集成的工程师。这篇笔记把从解压到跑通、再到调优和踩坑的完整路径讲清楚。2. 装之前先把门道理清gateways 组件是什么、装在哪里、需要什么环境2.1 网关并不是另一个数据库而是一层翻译器Oracle 网关的架构说穿了就是 Oracle 数据库外面挂一个翻译进程。当你在 Oracle 里执行SELECT * FROM tabdg4msql时Oracle 的优化器把 SQL 拆开通过网络把这个查询请求丢给网关进程网关再把它翻译成 SQL Server 能懂的 T-SQL去对端库取数据然后把结果集列定义翻译回 Oracle 的数据类型原路返回。整个过程对应用是透明的应用写 SQL 时只看到一棵远程表。所以这个 zip 包解压后里面不是一套完整的数据库软件而是这个翻译进程、驱动、初始化模板和监听插件。常见做法是把它装到一台已经存在的 Oracle 11gR2 数据库软件目录里让网关共享数据库的 ORACLE_HOME。这一点很多第一次接触的人会踩坑以为这个包能单独装成一个迷你数据库实际上它的 runInstaller 会要求你指定一个已有的 Oracle Home网关组件被塞进去和数据库共用环境变量。2.2 先确认操作系统和内核参数再谈解压这个包是 linux.x64 版本也就是说它只认 64 位的 Linux。我一般会在装之前先跑一遍环境检查脚本避免装到一半才发现 glibc 版本不对。# 检查 CPU 架构和操作系统版本 uname -m cat /etc/redhat-release # 检查内存和磁盘网关虽然轻但 ORACLE_HOME 本身要占 4GB 以上 free -g df -h /u01 # 确认安装了必要的依赖库缺了会在 runInstaller 阶段直接报错 rpm -qa | grep -E glibc|libaio|libgcc|libstdc这几条命令的作用分别是第一条确认是 x86_64 而不是 aarch64免得下错包第二条确认内存和磁盘网关进程本身占用不高但装了网关的 ORACLE_HOME 要跑数据库和监听内存少于 4GB 跑起来会很吃力第三条检查基础库11gR2 年代的系统依赖比较多。参数说明这里最需要注意的是 glibc 版本。Oracle 11gR2 官方认证的 glibc 是 2.12 左右CentOS/RHEL 6/7 都没问题如果系统是 RHEL 8 以上可能会遇到库不兼容常见做法是装兼容库或者干脆在虚拟机里跑一个 CentOS 6/7 专门放网关。2.3 解压与校验不要跳过 md5下载完linux.x64_11gR2_gateways.zip后先校验完整性。这个包经常在企业内网传输中途损坏是常有的解压时报 unexpected end of file 再回头排查浪费时间。# 先看包大小是否符合预期再解压 ls -lh linux.x64_11gR2_gateways.zip # 解压到指定目录注意不要解压到 ORACLE_HOME 里 mkdir -p /u01/software/gateways unzip linux.x64_11gR2_gateways.zip -d /u01/software/gateways # 解压后看目录结构正常情况下会得到 gateways 目录 ls -l /u01/software/gateways/gateways解压出来后会看到一个完整目录里面有 runInstaller、response 文件模板、以及各个网关子组件的目录。注意解压目标目录不能直接放在 ORACLE_HOME 下否则后续安装时 Oracle Universal Installer 会认为目录已存在拒绝继续。参数说明-d指定解压目标目录我习惯单独建一个 software 目录统一管理安装介质。如果解压过程中报错先检查 zip 文件大小和 md5不要反复重试同一个坏包。2.4 响应文件模板先改这六个参数别碰其他项Oracle 的静默安装依赖响应文件。解压后目录里有一个response/gateways.rsp模板用文本编辑器打开找到以下几项# 编辑响应文件的关键参数 vi /u01/software/gateways/gateways/response/gateways.rsp里面需要关注ORACLE_HOME填写已有的 Oracle 11gR2 数据库目录例如/u01/app/oracle/product/11.2.0/dbhome_1ORACLE_BASE数据库的 base 目录INSTALL_TYPE选择网关类型比如DG4MSQL表示 SQL Server 网关DG4SYSA表示 Sybase 网关DG4TER表示 Teradata 网关MYORACLESUPPORT_USERNAME置空本地安装不需要SECURITY_UPDATES_VIA_MYORACLESUPPORT改成falseDECLINE_SECURITY_UPDATES改成true参数说明INSTALL_TYPE一定不能默认很多人装着装着发现没有把网关组件装上就是因为这一项没改。DECLINE_SECURITY_UPDATES必须设为true否则安装器会卡在检查更新这一步非交互模式下直接退出。3. 从解压到监听起来网关安装的最小可行步骤3.1 静默安装命令与执行顺序响应文件改好后直接执行安装。这一步不需要图形界面适合在远程终端里操作。# 以 oracle 用户执行不要用 root su - oracle # 进入解压目录用响应文件做静默安装 cd /u01/software/gateways/gateways ./runInstaller -silent -responseFile /u01/software/gateways/gateways/response/gateways.rsp # 安装完成后查看日志确认没有 ERROR tail -f /u01/software/gateways/gateways/install/installActions*.log安装过程大概在 10 到 20 分钟之间取决于服务器磁盘速度。日志里看到Successfully字样基本就成了。如果中途失败不要直接重跑先把日志里ERROR附近二十行内容看清楚常见原因是 ORACLE_HOME 目录权限不对或者磁盘空间不足。参数说明-silent表示静默模式不弹 GUI。-responseFile指定响应文件路径。执行用户必须是 oracle不能是 root否则安装器写不了 ORACLE_HOME 下的文件。3.2 安装后检查目录确认网关组件落位装完不是直接能用先检查关键目录和文件是否生成。SQL Server 网关对应的程序名是dg4msql它在 ORACLE_HOME 下有自己的一套目录结构。# 确认网关执行文件和初始化文件模板存在 ls -l $ORACLE_HOME/bin/dg4msql ls -l $ORACLE_HOME/dg4msql/admin/ # 确认 lib 目录下有 so 库文件 ls -l $ORACLE_HOME/dg4msql/lib/执行文件存在只说明程序装好了但还不能直接用。网关要被 Oracle 监听进程拉起来所以下一步是配置监听。这一步也是常见的装了等于没装的根源程序在但监听不认它SQL 查询报出各种连接错误。3.3 配置 listener.ora让监听知道网关的存在监听配置是网关能不能被连上的第一步。在$ORACLE_HOME/network/admin/listener.ora中追加一段 SID_DESC指向网关程序。# 编辑 listener.ora vi $ORACLE_HOME/network/admin/listener.ora # 追加内容以实际 ORACLE_HOME 路径为准 SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME dg4msql) (ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1) (PROGRAM dg4msql) ) )这段配置的意思监听收到 SID 为dg4msql的连接请求时启动dg4msql这个外部程序来处理。PROGRAM是关键如果漏掉或者写错监听会用默认的oracle程序去拉网关结果拉起的是数据库实例报 ORA-28545。参数说明SID_NAME是网关对外暴露的标识后面 tnsnames 里会用到。PROGRAM必须填dg4msql不要填绝对路径监听会在$ORACLE_HOME/bin下找这个可执行文件。如果有多个网关类型比如同时装 SQL Server 和 Teradata就追加多个 SID_DESC。3.4 重启监听并验证端口配置改完必须重启监听否则配置不生效。# 重启监听 lsnrctl stop lsnrctl start # 查看监听状态确认 dg4msql 出现在服务列表里 lsnrctl status执行lsnrctl status后如果看到Service dg4msql has 1 instance(s)这行输出说明监听已经认到网关。如果没看到回查 listener.ora 的语法尤其是括号配平监听配置对括号非常敏感。4. 打通异构链路tnsnames 与 init 网关参数调优4.1 tnsnames.ora 里 HSOK 是硬性要求监听就绪后还要让 Oracle 数据库知道遇到 dg4msql 这个服务时要走异构服务框架这一步靠 tnsnames 里的(HSOK)参数。这个参数漏掉的典型表现是sqlplus 用相同的连接串在数据库本机测没问题但一查远程表就报 ORA-02085 或 ORA-28546。# 编辑 tnsnames.ora vi $ORACLE_HOME/network/admin/tnsnames.ora # 追加内容 DG4MSQL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST localhost)(PORT 1521)) (CONNECT_DATA (SID dg4msql)) (HS OK) )参数说明HOST写网关所在机器的地址如果应用和网关不在同一台机器这里要写应用能看到的那台机器的实际 IP。PORT必须和 listener.ora 里监听的端口一致一般是 1521。HSOK是让 Oracle 走异构服务流程的开关写(SID...)而不是(SERVICE_NAME...)因为网关是进程不是数据库实例不注册动态服务。处理器里还有一点tnsnames 的别名DG4MSQL是给数据库侧用的。在 Oracle 里创建数据库链接时用的就是这个别名。-- 在 Oracle 数据库里创建指向 SQL Server 的数据库链接 CREATE DATABASE LINK dg4msql_link CONNECT TO sa_user IDENTIFIED BY password USING DG4MSQL;这条 SQL 的意思是建立一条名为dg4msql_link的链接连接时用sa_user这个账号去访问网络路径走 tnsnames 里名为DG4MSQL的条目。这里的账号密码是 SQL Server 侧的真实账号不是 Oracle 的账号。4.2 init 网关参数字符集与连接串格式网关进程启动后读的是$ORACLE_HOME/dg4msql/admin/initdg4msql.ora。这个文件控制网关怎么连对端数据库、出错时留不留日志、字符集怎么转换。# 编辑网关初始化参数 vi $ORACLE_HOME/dg4msql/admin/initdg4msql.ora # 核心参数示例 HS_FDS_CONNECT_INFO 192.168.1.100:1433//report_db HS_FDS_TRACE_LEVEL OFF HS_FDS_RECOVERY_ACCOUNT RECOVER HS_FDS_RECOVERY_PWD RECOVER HS_LANGUAGE AMERICAN_AMERICA.ZHS16GBK参数说明HS_FDS_CONNECT_INFO是连接对端 SQL Server 的关键格式是IP:端口//数据库名。如果对端实例是命名实例不能只在 IP 后面写端口要写成IP//instance_name或者在最后追加实例名。这个格式最容易翻车少一个斜杠、端口没写对、数据库名拼错网关启动时直接报Unable to connect to SQL Server。HS_FDS_TRACE_LEVEL平时设成OFF出问题时改成ON或DEBUG网关会把翻译和连接过程写到 trace 文件里排查非常有帮助。线上环境记得改回来trace 日志增长很快磁盘被塞爆是我见过多次的事故。HS_LANGUAGE控制两边字符集匹配。Oracle 侧是 ZHS16GBKSQL Server 侧如果是简体中文环境这个值就用AMERICAN_AMERICA.ZHS16GBK。如果两侧都是 UTF-8就改成AMERICAN_AMERICA.AL32UTF8。字符集不一致的后果是中文乱码而且是偶尔乱、偶尔不乱的随机状态因为涉及多字节字符在转换边界被截断。4.3 第一次连通性测试sqlplus 直连网关配置文件都改好后先用 sqlplus 直连网关看能不能把网关进程拉起来。这一步成功就说明链路的基本路径已经通。# 用 sqlplus 直连网关注意连接串里的是网关 SID不是数据库 sqlplus sys/password//localhost:1521/dg4msql as sysdba如果不报错说明监听已经把网关拉起来了。接着测试真正查询 SQL Server-- 查看 SQL Server 的表结构通过数据库链接 SELECT * FROM user_tablesdg4msql_link; -- 直查一张业务表 SELECT TOP 10 * FROM dbo.ordersdg4msql_link;这里的user_tablesdg4msql_link查的是对端 SQL Server 的系统表用来验证链路通不通。能返回行说明链路整体OK。如果报 ORA-28545 或 ORA-02085问题基本在 listener.ora 或 tnsnames.ora按前面章节对照检查。4.4 用同义词把远程表降维成本地表数据库链接能通之后我一般会再做一步创建同义词。这一步的好处是把应用侧的改动降到零应用不需要知道数据来自远程表SQL 也不用改。-- 创建同义词让应用可以像查本地表一样查 SQL Server 的表 CREATE SYNONYM orders_sync FOR dbo.ordersdg4msql_link; -- 验证同义词查询 SELECT COUNT(*) FROM orders_sync;参数说明orders_sync是同义词名应用 SQL 里直接写这个名称。dbo.orders是 SQL Server 侧的表名dbo是 SQL Server 的默认架构如果表在其他架构下这里要对应修改。创建同义词后原来写的针对远程表的复杂查询比如 JOIN 和多表子查询都可以直接套用但性能要和业务确认因为网关查询是逐条翻译复杂 JOIN 在网关层可能比较吃力。5. 避坑手册网关连接最常见的五个翻车现场5.1 ORA-28545监听拉起了错误程序现象用 sqlplus 直连网关报ORA-28545: error diagnosed by Net8 when connecting to an agent。原因listener.ora 的 SID_DESC 里PROGRAM没写或者写成了别的程序监听拿 oracle 执行文件去当网关拉拉起来的东西不会讲 HS 协议。解决把PROGRAM dg4msql补上重启监听。排查时先执行lsnrctl services看服务状态确认dg4msql是否注册为 external 程序。遇到过一种情况是PROGRAM写对了但 ORACLE_HOME 路径末尾多了空格导致监听找不到可执行文件这类隐形字符很难看出来建议把整段配置删掉重新手打。5.2 HS_FDS_CONNECT_INFO 格式错误导致连不上 SQL Server现象网关能启动但查询时报ORA-28500: connection from ORACLE to a non-Oracle system failed跟日志里跟着一条来自 ODBC 驱动的连接失败消息。原因HS_FDS_CONNECT_INFO的连接串格式不对。11g 的 dg4msql 用IP:端口//数据库名格式少一个斜杠、或者端口和数据库名顺序写反都会失败。解决先确认 SQL Server 端口是否可达用telnet 192.168.1.100 1433验证。再确认格式为地址:端口//库名。如果对端是命名实例不要硬写端口直接在末尾写实例名例如192.168.1.100//instance2/sql2008具体语法取决于网关驱动版本建议用网关自带的 ODBC 配置先测一遍连接串把驱动能用的字符串抄过来。5.3 中文乱码不是数据库问题是 HS_LANGUAGE 没配对现象数字和英文正常中文显示成问号或者乱码而且不同的表乱码程度还不一样。原因Oracle 字符集与 SQL Server 字符集不一致网关在中间转码时没能正确映射。典型场景是 Oracle 用 AL32UTF8SQL Server 是简体中文的 GBK两边对汉字的字节编码完全不同。解决查 Oracle 的NLS_CHARACTERSET用命令SELECT value FROM nls_database_parameters WHERE parameterNLS_CHARACTERSET。然后修改网关的HS_LANGUAGE与 Oracle 字符集对齐。如果两边都用 UTF-8就设为AMERICAN_AMERICA.AL32UTF8。改完记得重启监听让网关进程按新参数重新启动。血泪经验只改 Oracle 的 NLS_LANG 不解决根本问题必须保证网关的HS_LANGUAGE和 Oracle 数据库字符集一致还要看 SQL Server 排序规则。5.4 查询超时大表全表扫描拖垮网关现象单条查询几十秒不返回网关所在机器 CPU 飙升数据库侧 netstat 看到大量 ESTABLISHED 连接。原因网关是外部进程SQL Server 的索引、统计信息和 Oracle 优化器完全隔离。Oracle 优化器不知道对端表有多大生成执行计划时可能选择了全表扫描把几百万行数据通过网络拉回来再做筛选。解决对远程表的查询尽量在 SQL 里写紧过滤条件条件能下推的话网关会直接传给 SQL Server 执行。比如WHERE order_date TO_DATE(2024-01-01,YYYY-MM-DD)这类条件比WHERE TO_CHAR(order_date,YYYY-MM-DD) 2024-01-01更容易下推。另外在 Oracle 侧给远程表建物化视图定时刷新把实时性要求不高的查询打到物化视图上网关压力会小很多。5.5 无法执行 UPDATE/DELETE 或分布式事务失败现象SELECT 正常但执行 UPDATE 或 DELETE 时有时报ORA-02070: database ... does not support ...或是在事务中使用多个远程链接时报分布式事务错误。原因网关对写入操作有严格限制尤其是分布式事务需要两阶段提交11gR2 网关对非 Oracle 端的写事务支持有限。部分精确的更新语句可以执行但涉及跨库事务、触发器、自增列回填时网关翻译不了。解决明确使用边界网关主力场景是只读查询。写入操作要么走 ETL 工具要么在 SQL Server 侧做。如果必须在 Oracle 里发起写入确保事务中只涉及这一个远程链接不要混用其他链接。分布式事务失败时用COMMIT或ROLLBACK收尾不要直接断开会话否则对端可能留下悬挂事务。6. 验证与进阶从能查到查得快的实用技巧建好网关、跑通第一条查询这不是终点。我自己的习惯是每次配置变化后做一轮系统验证既保连通也保速度。第一件事是写一段固定的健康检查 SQL存成脚本定期手动跑一遍-- 健康检查速度、连通性、字符集三合一 SELECT COUNT(*) FROM dbo.ordersdg4msql_link WHERE order_date SYSDATE - 7;这条查询如果 5 秒内返回说明链路通畅。如果超过 10 秒就要警惕是数据量涨了还是网络延迟高了或者是 SQL Server 侧资源紧张。平时把这个命令记在运维手册里比临时拼 SQL 快得多。第二件事是查看网关 trace 日志。把HS_FDS_TRACE_LEVEL临时改成ON跑一条问题查询然后在$ORACLE_HOME/dg4msql/trace目录下找最新的日志文件。日志里能看到网关实际发送给 SQL Server 的 T-SQL可以反过来验证我们的 SQL 是否被正确下推和翻译。确认问题后第一时间把 trace 改成OFF否则日志增长很快。第三件事值得长期做的是把网关查询的数据量纳入容量规划。网关适合的是小数据量、高并发不高的点查比如订单状态、用户明细。那种几千万行的分析统计怎么优化都不如在 SQL Server 侧先出聚合结果再让 Oracle 拉小结果集。我踩过的最大一次跟头就是让网关直连一张三千万行的流水表做汇总查询把网关所在服务器的 CPU 打满最终被迫停掉网关整改成物化视图方案。希望这篇笔记帮你在配置 Oracle 11gR2 网关时少走几趟弯路。先跑通最小链路再逐步放开查询范围每一项参数改动都对应着一次监听重启和一次连通性测试这个习惯会让你少吃很多亏。本文还有配套的精品资源点击获取