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