Oracle DG4ODBC + PostgreSQL ODBC 驱动 + DBLINK 实现oracel访问postgresql

整体架构:

Oracle11g

│ DBLINK

DG4ODBC(Oracle Heterogeneous Services)

│ unixODBC

PostgreSQL ODBC Driver(psqlODBC)

PostgreSQL 14.6

Oracle 11g 本身不能直接访问 PostgreSQL,需要通过 ODBC 网关实现。DG4ODBC 是 Oracle 官方提供的异构数据库访问组件。

一、环境假设

Oracle 服务器

Oracle 11.2.0.4

centos7.9

Linux x86_64

IP: 192.192.103.113

PostgreSQL 服务器

PostgreSQL 14.6

centos7.9

IP: 192.192.103.117

Port: 5432

DB: postgres

User: postgres

Password: postgres

Schema: public

Table: t1

Schema: test

Table: tb1

以下所有操作都在 Oracle 服务器执行。

二、Oracle服务器安装 ODBC 驱动

yum install -y unixODBC unixODBC-devel

root@ora113 \~# odbcinst -j

unixODBC 2.3.1

DRIVERS............: /etc/odbcinst.ini

SYSTEM DATA SOURCES: /etc/odbc.ini

FILE DATA SOURCES..: /etc/ODBCDataSources

USER DATA SOURCES..: /root/.odbc.ini

SQLULEN Size.......: 8

SQLLEN Size........: 8

SQLSETPOSIROW Size.: 8

root@ora113 \~#

三、安装 PostgreSQL ODBC 驱动(重点)

yum install -y postgresql-odbc (centos7自带的pg odbc版本太低无法连接11g)

建议下载安装包,手动安装新的pg odbc

postgresql14-libs-14.23-2PGDG.rhel7.9.x86_64.rpm

postgresql14-odbc-16.00.0000-1PGDG.rhel7.x86_64.rpm

下载链接:

https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-7-x86_64/

安装后检查:

find / -name "psqlodbc*.so"

root@ora113 \~# find / -name "psqlodbc*.so"

/usr/lib64/psqlodbc.so

/usr/lib64/psqlodbcw.so

/usr/pgsql-14/lib/psqlodbc.so

/usr/pgsql-14/lib/psqlodbca.so

/usr/pgsql-14/lib/psqlodbcw.so

我们使用新装的/usr/pgsql-14/lib

四、配置 /etc/odbcinst.ini

编辑:

vi /etc/odbcinst.ini

加入:

PostgreSQL

Description = ODBC for PostgreSQL

Driver = /usr/pgsql-14/lib/psqlodbcw.so

Setup = /usr/pgsql-14/lib/libodbcpsqlS.so

FileUsage = 1

五、配置 /etc/odbc.ini

vi /etc/odbc.ini

加入:

pg_dsn

Description = Connection to PostgreSQL

Driver = PostgreSQL

Database = postgres

Servername = 192.192.103.117

UserName = postgres

Password = postgres

Port = 5432

ReadOnly = No

六、测试 ODBC 是否正常(非常重要)

安装:

yum install -y unixODBC

测试:

oracle@ora113 \~$ isql -v pg_dsn

成功会看到:

+---------------------------------------+

| Connected! |

如果这里不通:

Oracle 一定不可能访问 PostgreSQL。第一步必须测通。

七、配置 Oracle DG4ODBC

Oracle11g 自带 DG4ODBC。

进入:

cd $ORACLE_HOME/hs/admin

复制模板:

cp initdg4odbc.ora initpg_link.ora

编辑:

vi initpg_link.ora

内容:

HS_FDS_CONNECT_INFO = pg_dsn

HS_FDS_TRACE_LEVEL = ON

HS_FDS_SHAREABLE_NAME = /usr/pgsql-14/lib/psqlodbc.so

关键:

HS_FDS_CONNECT_INFO = pg_dsn

必须和:

/etc/odbc.ini

中的 DSN 名一致。

八、配置 listener.ora

编辑:

vi $ORACLE_HOME/network/admin/listener.ora

增加:

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = pg_link)

(ORACLE_HOME = /oracle/app/oracle/product/11.2.0.4/dbhome_1)

(PROGRAM = dg4odbc)

)

)

此处的SID_NAME 自定义,不予oracle数据库的SID冲突即可。

九、配置 tnsnames.ora

编辑:

vi $ORACLE_HOME/network/admin/tnsnames.ora

增加:

PG_GATEWAY =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = ora113)(PORT = 1521))

(CONNECT_DATA =

(SID = pg_link)

)

(HS = OK)

)

SID 与配置八的SID_NAME保持一致,HOST填写oracle本机的主机名或者IP皆可。

十、重启监听

lsnrctl stop

lsnrctl start

检查:

lsnrctl status

oracle@ora113 admin$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-MAY-2026 16:00:37

Copyright (c) 1991, 2013, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora113)(PORT=1521)))

STATUS of the LISTENER


Alias LISTENER

Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production

Start Date 22-MAY-2026 15:40:04

Uptime 0 days 0 hr. 20 min. 32 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /oracle/app/oracle/product/11.2.0.4/dbhome_1/network/admin/listener.ora

Listener Log File /oracle/app/oracle/diag/tnslsnr/ora113/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora113)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "orcl" has 1 instance(s).

Instance "orcl", status READY, has 1 handler(s) for this service...

Service "orclXDB" has 1 instance(s).

Instance "orcl", status READY, has 1 handler(s) for this service...

Service "pg_link" has 1 instance(s).

Instance "pg_link", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

可以看到:

Service "pg_link" has 1 instance(s)

十一、Oracle 创建 DBLINK

登录 Oracle:

CREATE PUBLIC DATABASE LINK PG_LINK_DB CONNECT TO "postgres" IDENTIFIED BY "postgres" USING 'PG_GATEWAY';

十二、测试访问 PostgreSQL

Oracle 正确访问 PostgreSQL 的方法

方法1(推荐)

使用双引号 + 小写

select * from "t1_v"@PG_LINK_DB;

如果在非 public schema:

select * from "public"."t1_v"@PG_LINK_DB;

这是最标准方法。

SQL> select count(*) from "t1"@PG_LINK_DB;

COUNT(*)


100

SQL> select * from "test"."tb1"@PG_LINK_DB;

c1 c2


1 AA

2 BB

相关推荐
云絮.7 小时前
数据库操作
数据库·mysql·算法·oracle
曹牧13 小时前
Oracle:CHR
数据库·oracle
又至冬日15 小时前
鸿蒙(HarmoneyOS),封装一个通用关系型数据库操作类
数据库·oracle·harmonyos
Nontee15 小时前
新手数据库避坑指南:通俗理解“页分裂”与“数据碎片”
数据库·oracle
Vd7H20A715 小时前
TencentOS Server 3.3 安装 PostgreSQL 18 完整指南
数据库·postgresql
Nontee16 小时前
新手建表指南:数据库主键选自增ID还是UUID?
数据库·oracle
云道轩17 小时前
Oracle Fusion Cloud Applications Suite 与 SAP S/4HANA 全方位对比
oracle·sap·业务套件
asdfg125896317 小时前
BeanListHandler的通俗理解
java·数据库·oracle
ClouGence17 小时前
Oracle BLOB 实时同步为什么这么难?一次看懂背后的 5 个技术挑战
数据库·oracle