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

相关推荐
一只fish2 小时前
Oracle官方文档翻译《Database Concepts 26ai》第10章-SQL
数据库·oracle
jnrjian2 小时前
export partition 的par file
数据库·oracle
不甘先生2 小时前
PostgreSQL 数据库基础一览表
数据库·postgresql
人生苦短1283 小时前
CentOS 7.9 部署 PostgreSQL 15.17 + PostGIS 3.4.8 操作文档
linux·postgresql·centos
运维技术分享与探索4 小时前
Oracle大表更新优化三妙招
oracle
东风破1375 小时前
DM达梦数据库安全、审计功能学习记录
数据库·学习·oracle·dm达梦数据库
JAVA学习通5 小时前
《大营销平台系统设计实现》 - 营销服务 第10节:不超卖库存规则实现
java·数据库·oracle·责任链模式·codex
曲幽14 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
Muscleheng19 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql