在Oracle数据库中,dg4odbc 是 Oracle Database Gateway for ODBC 的一个可执行程序名。这个网关允许Oracle数据库通过ODBC接口连接到非Oracle数据库(如达梦数据库、MySQL、SQL Server等)。
工作流程如下:
1)应用程序通过Oracle数据库链接(DB Link)访问非Oracle数据库。
2)Oracle数据库通过监听器将请求转发给 dg4odbc 进程。
3)dg4odbc 进程读取相应的HS初始化文件(如 initdm8.ora)来获取ODBC配置信息。
4)dg4odbc 通过ODBC驱动管理器加载指定的ODBC驱动,并连接到目标数据库。
5)执行SQL并返回结果。
Oracle Client → Oracle Listener → dg4odbc 进程 → ODBC Driver → 目标数据库(如达梦)
操作系统 CentOS Linux release 7.6.1810 (Core)
cpu x86
oracle版本 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
oracle信息 ip:192.168.138.111 1521 sid:orcl
达梦版本 DM V8
ip:192.168.138.48 5236
(此步骤与配置普通odbc一致)
如果oracle和dm服务器类型一致,可以直接将dm上的bin文件打包拷贝到oracle上,如果不一致,则需要单独安装达梦数据库。
oracle服务器上odbc配置
安装oracle过程中,已安装odbc
[oracle@localhost ~]$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/oracle/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
/etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /home/oracle/dmdbms_4_80p36/bin/libdodbc.so
/etc/odbc.ini
[dm8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = 192.168.138.48
UID = SYSDBA
PWD = Dameng_123
TCP_PORT = 5236
oracle中.bash_profile添加
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/oracle/dmdbms_4_80p36/bin"
测试
[oracle@localhost ~]$ isql -v dm8
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select id_code;
+----------------------------------------------+
| ID_CODE |
+----------------------------------------------+
| --03134284368-20250929-295229-20149 Pack36 |
+----------------------------------------------+
SQLRowCount returns 1
1 rows fetched
[oracle@localhost admin]$ cat /opt/oracle/product/11.2.0/db/hs/admin/initdm8.ora
HS_FDS_CONNECT_INFO=dm8
HS_FDS_TRACE_LEVEL=off
HS_FDS_SHAREABLE_NAME=/home/oracle/dmdbms_4_80p36/bin/libdodbc.so
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8
HS_NLS_NCHAR=UCS2
注意:这里需要注意的是dm8要与/etc/odbc.ini中的dm8保持一致
[oracle@localhost admin]$ cat /opt/oracle/product/11.2.0/db/network/admin/listener.ora
listener.ora Network Configuration File: /opt/oracle/product/11.2.0/db/network/admin/listener.ora
Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dm8)
(ORACLE_HOME=/opt/oracle/product/11.2.0/db)
(PROGRAM=dg4odbc)
)
)
ADR_BASE_LISTENER = /opt/oracle
中间蓝色部分为新增部分。其中SID_NAME对应gateway参数配置文件后面的名称init+SID_NAME.ora。即/opt/oracle/product/11.2.0/db/hs/admin/initdm8.ora中的dm8要与此处的SID_NAME保持一致。
PROGRAM=dg4odbc固定写法,无需改动,表示执行/opt/oracle/product/11.2.0/db/bin下面的此程序
ll /opt/oracle/product/11.2.0/db/bin/dg4odbc
重启监听
lsnrctl stop/start
lsnrctl status
[oracle@localhost admin]$ cat /opt/oracle/product/11.2.0/db/network/admin/tnsnames.ora
dm8tns =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.138.111)(PORT=1521))
(CONNECT_DATA=(SID=dm8))
(HS=OK)
)
配置完成后tnsping验证
[oracle@localhost admin]$ tnsping dm8tns
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 13-OCT-2025 23:09:00
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.138.111)(PORT=1521)) (CONNECT_DATA=(SID=dm8)) (HS=OK))
OK (0 msec)
create public database link dmlink connect to SYSDBA identified by "Dameng_123" using 'dm8tns';
SQL> select * from v$version@dmlink;
DM Database Server 64 V8
DB Version: 0x7000d
03134284368-20250929-295229-20149
Msg Version: 44
Gsu level(5) cnt:
--中文测试
SQL> select * from t1@dmlink;
1 中文测试
--insert测试
SQL> insert into t1@dmlink values(2,'测试2');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t1@dmlink;
1 中文测试
2 测试2
--删除
drop public database link dmlink;
SQL> select 1 from dual@dmlink;
select 1 from dual@dmlink
*
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
如果报错如下,检查如下配置,是否HS_NLS_NCHAR=UCS2没有添加
[oracle@localhost admin]$ cat initdm8.ora
HS_FDS_CONNECT_INFO=dm8
HS_FDS_TRACE_LEVEL=off
HS_FDS_SHAREABLE_NAME=/home/oracle/dmdbms_4_80p36/bin/libdodbc.so
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8
HS_NLS_NCHAR=UCS2
文章
阅读量
获赞
