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

相关推荐
smallyoung20 小时前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
ClouGence9 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
ClouGence15 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧16 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间16 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心16 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Curvatureflight16 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-07000116 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben16 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu16 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构