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

相关推荐
宇宙第一小趴菜6 小时前
五、Oracle vs MySQL 架构深度对比笔记
mysql·oracle·架构
凌虚1 天前
基于 PostgreSQL WAL 构建 CDC 系统:原理与工程实现
数据库·后端·postgresql
BullSmall1 天前
PostgreSQL 14 pg_dumpall 完整备份指南
数据库·postgresql·oracle
宇宙第一小趴菜1 天前
三、Oracle 核心原理
数据库·oracle
龙仔7251 天前
SQL Server OS_Core 数据库全自动备份【完整笔记·可直接复用】
数据库·笔记·oracle
Cloud云卷云舒2 天前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
段一凡-华北理工大学2 天前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh2 天前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
会编程的土豆2 天前
数据库范式
数据库·oracle
—Miss. Z—2 天前
计算机二级MySQL——简单应用题(存储过程&存储函数)
数据库·oracle·php