整体架构:
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