
原先两个Oracle数据库,通过DBLINK直连就能轻松实现数据互通,操作简单又顺畅。可一旦其中一个数据库换成达梦(DM),之前的DBLINK就直接“罢工”,业务查询、数据同步全卡壳,急得人抓耳挠腮。
其实核心问题很简单:Oracle原生不支持直接连接达梦数据库,原有的同构DBLINK(Oracle-Oracle)无法适配异构数据库(Oracle-达梦)。但不用慌,今天就给大家带来一套完整解决方案,手把手教你配置,几乎不用修改应用代码,就能恢复DBLINK的正常使用!
Oracle和达梦是不同厂商的数据库,底层语法、通信协议存在差异,就像两个说不同语言的人,无法直接对话。这时候就需要一个“翻译官”,搭建起两者沟通的桥梁——这套“翻译系统”由3个核心组件构成:
另外,配置前请确认几个前提条件,避免走弯路:
大部分生产环境用的是Linux,我们重点讲解Linux环境的完整配置步骤,每一步都有具体命令,直接复制执行即可;Windows环境只讲关键差异点,避免重复。
ODBC是连接的基础,先安装工具,再配置达梦的驱动和数据源。
# 1. 安装unixODBC(CentOS/RHEL系统,其他系统替换成对应包管理命令)
yum install -y unixODBC unixODBC-devel
# 2. 配置达梦ODBC驱动(编辑odbcinst.ini文件)
cat > /etc/odbcinst.ini << EOF
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
DRIVER = /home/dmdba/dmdbms/bin/libdodbc.so # 达梦ODBC驱动路径,根据实际安装路径修改
Threading = 0
EOF
# 3. 配置达梦数据源(编辑odbc.ini文件,填写达梦连接信息)
cat > /etc/odbc.ini << EOF
[DM8]
Description = DM8 ODBC DSN
Driver = DM8 ODBC DRIVER # 对应上面odbcinst.ini中的驱动名
SERVER = 192.168.1.100 # 达梦数据库IP,替换成你的实际IP
UID = SYSDBA # 达梦用户名,默认SYSDBA
PWD = SYSDBA # 达梦密码,默认SYSDBA,建议修改
PORT = 5236 # 达梦默认端口,未修改则不用改
EOF
# 4. 测试ODBC连接是否成功(成功会提示Connected!)
isql -v DM8 SYSDBA SYSDBA
提示:如果测试失败,先检查达梦服务是否正常启动,IP、端口是否能ping通,驱动路径是否正确。
透明网关是核心,需要创建配置文件,指定ODBC数据源和相关参数。
# 1. 进入Oracle透明网关配置目录(路径根据Oracle安装目录修改)
cd $ORACLE_HOME/hs/admin
# 2. 创建并编辑HS配置文件(文件名格式:init+数据源名.ora,这里数据源名是DM8)
vi initDM8.ora
# 3. 写入以下配置(直接复制,无需修改,除非数据源名不是DM8)
HS_FDS_CONNECT_INFO = DM8 # 对应odbc.ini中的数据源名
HS_FDS_TRACE_LEVEL = OFF # 关闭跟踪,减少日志占用
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
set ODBCINI=/etc/odbc.ini # 指定ODBC配置文件路径
HS_NLS_NCHAR=UCS2 # 处理Unicode字符,避免中文乱码
监听是Oracle接收连接请求的“大门”,需要添加透明网关的服务,让Oracle能识别到达梦的连接。
# 1. 编辑监听配置文件
vi $ORACLE_HOME/network/admin/listener.ora
# 2. 在SID_LIST_LISTENER中添加以下内容(替换Oracle安装路径)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = DM8) # 与HS配置文件名一致(initDM8.ora)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1) # 替换成你的Oracle安装路径
(PROGRAM = dg4odbc) # 固定写dg4odbc,透明网关程序
)
)
# 3. 重启监听,使配置生效
lsnrctl stop
lsnrctl start
配置本地网络服务,让Oracle能通过TNS访问到达梦数据库,相当于给达梦数据库起一个“别名”。
# 1. 编辑tnsnames.ora文件
vi $ORACLE_HOME/network/admin/tnsnames.ora
# 2. 添加以下内容(HOST是Oracle服务器IP,PORT是监听端口)
DM8 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) # HOST替换成Oracle服务器IP,PORT是Oracle监听端口(默认1521)
(CONNECT_DATA =
(SID = DM8) # 与监听中SID_NAME一致
)
(HS = OK) # 关键!启用异构服务,必须加
)
# 3. 测试TNS连接是否成功(成功会提示OK)
tnsping DM8
配置完成后,创建DBLINK,就能像原来访问Oracle数据库一样,访问达梦数据库了。
-- 登录Oracle数据库(sqlplus或plsql)
sqlplus / as sysdba
-- 创建公有DBLINK(所有人都能使用,也可以创建私有DBLINK)
CREATE PUBLIC DATABASE LINK ORA_TO_DM
CONNECT TO "SYSDBA" IDENTIFIED BY "SYSDBA" # 达梦的用户名和密码,双引号不能少
USING 'DM8'; -- 对应tnsnames.ora中的服务名(别名)
-- 测试连接:查询达梦数据库中的表(替换成你的表名)
SELECT * FROM "SYSDBA"."TEST_TABLE"@ORA_TO_DM;
提示:达梦默认大小写敏感,访问表、字段时,必须用双引号包裹,否则会报“对象不存在”错误!
如果你的环境是Windows,核心步骤和Linux一致,重点差异在这3点:
除了上面的“透明网关+ODBC”方案,还有3种替代方案,根据你的业务场景选择。
方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
透明网关+ODBC(推荐) | 无需修改应用代码,保持原有DBLINK访问方式 | 配置稍复杂,性能一般 | 需兼容原有DBLINK代码,不想改应用 |
达梦端创建DBLINK连Oracle | 配置简单,性能更优 | 需修改应用连接方式 | 可调整应用架构,追求更好性能 |
ETL工具同步数据 | 性能最佳,数据本地化,查询更快 | 数据有延迟,不适合实时查询 | 非实时查询、报表统计等场景 |
JDBC/ODBC直连 | 灵活,适合新开发项目 | 需大幅修改应用代码 | 全新应用开发,无需兼容旧代码 |
重点推荐:如果不想修改应用代码,优先选透明网关+ODBC;如果能调整应用,建议优先选达梦端创建DBLINK,性能更优。
很多人配置完连不上,大概率是踩了以下坑,提前规避:
"SYSDBA"."TEST_TABLE"),Oracle则不强制。ALTER DATABASE LINK修改。
配置完DBLINK后,应用只需做2点小修改,就能正常使用:
NEXTVAL,达梦也支持,无需修改,但需确保达梦端已创建对应序列。SYSDATE)兼容,少数特殊函数(如Oracle的NVL2),需替换为达梦对应的函数。Oracle换到达梦后,原DBLINK无法直接使用,核心是通过透明网关+ODBC搭建异构连接,相当于给两者加了一个“翻译官”,就能保持原有访问方式,最小化应用改动。
如果追求更优性能,可考虑在达梦端创建DBLINK反向连接Oracle;如果是非实时场景,ETL数据同步会更合适。
最后提醒:配置过程中,每一步都要测试(ODBC测试、TNS测试、DBLINK测试),发现问题及时排查,大部分报错都是IP、端口、驱动路径或权限问题。
如果遇到配置报错,评论区留言你的操作系统(Linux/Windows)、Oracle版本和达梦版本,帮你快速排查!