postgresql oracle_fdw访问oracle数据

1、环境准备

--下载安装包:

https://github.com/laurenz/oracle_fdw/releases

--下载安装oracle client:

oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-odbc-12.2.0.1.0-2.x86_64.rpm

oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm

--编辑pg环境变量,添加oracle lib变量

postgres@pg117 ~]$ cat ~/.bash_profile

.bash_profile

Get the aliases and functions

if -f \~/.bashrc ; then

. ~/.bashrc

fi

User specific environment and startup programs

PATH=PATH:HOME/.local/bin:$HOME/bin

export PATH

export PGHOME=/postgresql/pg18

export PGDATA=/postgresql/pgdata

export PATH=PGHOME/bin:PATH

export LD_LIBRARY_PATH=PGHOME/lib:/usr/lib/oracle/12.2/client64/lib:LD_LIBRARY_PATH

2、编译安装oracle_fdw

postgres@pg117 soft$ tar zxvf oracle_fdw-ORACLE_FDW_2_8_0.tar.gz

oracle_fdw-ORACLE_FDW_2_8_0/

oracle_fdw-ORACLE_FDW_2_8_0/.gitignore

oracle_fdw-ORACLE_FDW_2_8_0/CHANGELOG

oracle_fdw-ORACLE_FDW_2_8_0/LICENSE

oracle_fdw-ORACLE_FDW_2_8_0/Makefile

oracle_fdw-ORACLE_FDW_2_8_0/README.md

oracle_fdw-ORACLE_FDW_2_8_0/README.oracle_fdw

oracle_fdw-ORACLE_FDW_2_8_0/TODO

oracle_fdw-ORACLE_FDW_2_8_0/expected/

oracle_fdw-ORACLE_FDW_2_8_0/expected/oracle_fdw.out

oracle_fdw-ORACLE_FDW_2_8_0/expected/oracle_gis.out

oracle_fdw-ORACLE_FDW_2_8_0/expected/oracle_import.out

oracle_fdw-ORACLE_FDW_2_8_0/expected/oracle_join.out

oracle_fdw-ORACLE_FDW_2_8_0/msvc/

oracle_fdw-ORACLE_FDW_2_8_0/msvc/oracle_fdw.props

oracle_fdw-ORACLE_FDW_2_8_0/msvc/oracle_fdw.sln

oracle_fdw-ORACLE_FDW_2_8_0/msvc/oracle_fdw.vcxproj

oracle_fdw-ORACLE_FDW_2_8_0/msvc/oracle_msvc.c

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw--1.0--1.1.sql

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw--1.1--1.2.sql

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw--1.2.sql

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw.c

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw.control

oracle_fdw-ORACLE_FDW_2_8_0/oracle_fdw.h

oracle_fdw-ORACLE_FDW_2_8_0/oracle_gis.c

oracle_fdw-ORACLE_FDW_2_8_0/oracle_utils.c

oracle_fdw-ORACLE_FDW_2_8_0/sql/

oracle_fdw-ORACLE_FDW_2_8_0/sql/oracle_fdw.sql

oracle_fdw-ORACLE_FDW_2_8_0/sql/oracle_gis.sql

oracle_fdw-ORACLE_FDW_2_8_0/sql/oracle_import.sql

oracle_fdw-ORACLE_FDW_2_8_0/sql/oracle_join.sql

postgres@pg117 soft$ cd oracle_fdw-ORACLE_FDW_2_8_0/

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ ll

total 488

-rw-rw-r-- 1 postgres postgres 29202 May 10 2025 CHANGELOG

drwxrwxr-x 2 postgres postgres 98 May 10 2025 expected

-rw-rw-r-- 1 postgres postgres 1059 May 10 2025 LICENSE

-rw-rw-r-- 1 postgres postgres 1475 May 10 2025 Makefile

drwxrwxr-x 2 postgres postgres 99 May 10 2025 msvc

-rw-rw-r-- 1 postgres postgres 231 May 10 2025 oracle_fdw--1.0--1.1.sql

-rw-rw-r-- 1 postgres postgres 240 May 10 2025 oracle_fdw--1.1--1.2.sql

-rw-rw-r-- 1 postgres postgres 1244 May 10 2025 oracle_fdw--1.2.sql

-rw-rw-r-- 1 postgres postgres 228036 May 10 2025 oracle_fdw.c

-rw-rw-r-- 1 postgres postgres 133 May 10 2025 oracle_fdw.control

-rw-rw-r-- 1 postgres postgres 9168 May 10 2025 oracle_fdw.h

-rw-rw-r-- 1 postgres postgres 44511 May 10 2025 oracle_gis.c

-rw-rw-r-- 1 postgres postgres 104895 May 10 2025 oracle_utils.c

lrwxrwxrwx 1 postgres postgres 17 May 10 2025 README.md -> README.oracle_fdw

-rw-rw-r-- 1 postgres postgres 44318 May 10 2025 README.oracle_fdw

drwxrwxr-x 2 postgres postgres 98 May 10 2025 sql

-rw-rw-r-- 1 postgres postgres 948 May 10 2025 TODO

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ make

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -fvisibility=hidden -I"/sdk/include" -I"/oci/include" -I"/rdbms/public" -I"/" -I/usr/include/oracle/12.2/client64 -I. -I./ -I/postgresql/pg18/include/server -I/postgresql/pg18/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -c -o oracle_fdw.o oracle_fdw.c

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -fvisibility=hidden -I"/sdk/include" -I"/oci/include" -I"/rdbms/public" -I"/" -I/usr/include/oracle/12.2/client64 -I. -I./ -I/postgresql/pg18/include/server -I/postgresql/pg18/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -c -o oracle_utils.o oracle_utils.c

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -fvisibility=hidden -I"/sdk/include" -I"/oci/include" -I"/rdbms/public" -I"/" -I/usr/include/oracle/12.2/client64 -I. -I./ -I/postgresql/pg18/include/server -I/postgresql/pg18/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -c -o oracle_gis.o oracle_gis.c

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -fvisibility=hidden -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/postgresql/pg18/lib -Wl,--as-needed -Wl,-rpath,'/postgresql/pg18/lib',--enable-new-dtags -fvisibility=hidden -L"/" -L"/bin" -L"/lib" -L"/lib/amd64" -L/usr/lib/oracle/12.2/client64/lib -lclntsh

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ make install

/bin/mkdir -p '/postgresql/pg18/lib'

/bin/mkdir -p '/postgresql/pg18/share/extension'

/bin/mkdir -p '/postgresql/pg18/share/extension'

/bin/mkdir -p '/postgresql/pg18/share/doc/extension'

/bin/install -c -m 755 oracle_fdw.so '/postgresql/pg18/lib/oracle_fdw.so'

/bin/install -c -m 644 .//oracle_fdw.control '/postgresql/pg18/share/extension/'

/bin/install -c -m 644 .//oracle_fdw--1.2.sql .//oracle_fdw--1.0--1.1.sql .//oracle_fdw--1.1--1.2.sql '/postgresql/pg18/share/extension/'

/bin/install -c -m 644 .//README.oracle_fdw '/postgresql/pg18/share/doc/extension/'

--编译完登录数据库安装extension可能会无法识别lib,重启一下pg数据库即可。

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ psql

psql (18.3)

Type "help" for help.

postgres=# create extension oracle_fdw;

ERROR: could not load library "/postgresql/pg18/lib/oracle_fdw.so": libclntsh.so.12.1: cannot open shared object file: No such file or directory

CONTEXT: SQL statement "CREATE FUNCTION oracle_fdw_handler() RETURNS fdw_handler

AS '$libdir/oracle_fdw'

LANGUAGE C STRICT"

extension script file "oracle_fdw--1.2.sql", near line 1

postgres=# \q

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ pg_ctl restart

waiting for server to shut down..... done

server stopped

waiting for server to start....2026-05-26 09:49:00.682 CST 27552 LOG: redirecting log output to logging collector process

2026-05-26 09:49:00.682 CST 27552 HINT: Future log output will appear in directory "log".

done

server started

重新创建extension

postgres@pg117 oracle_fdw-ORACLE_FDW_2_8_0$ psql

psql (18.3)

Type "help" for help.

postgres=# create extension oracle_fdw ;

CREATE EXTENSION

postgres=# \dx

List of installed extensions

Name | Version | Default version | Schema | Description

--------------------+---------+-----------------+------------+------------------------------------------------------------------------

oracle_fdw | 1.2 | 1.2 | public | foreign data wrapper for Oracle access

pg_stat_statements | 1.12 | 1.12 | public | track planning and execution statistics of all SQL statements executed

plpgsql | 1.0 | 1.0 | pg_catalog | PL/pgSQL procedural language

(3 rows)

postgres=# SELECT oracle_diag();

oracle_diag


oracle_fdw 2.8.0, PostgreSQL 18.3, Oracle client 12.2.0.1.0, ORACLE_HOME=/usr/lib/oracle/12.2/client64/lib

(1 row)

3、配置fdw

--创建外部服务器

postgres=# create server oratest_fdw foreign data wrapper oracle_fdw options(dbserver '192.192.103.111:1521/oratest');

CREATE SERVER

--授权使用的用户

postgres=# grant usage on foreign server oratest_fdw to postgres;

GRANT

--创建用户映射,连接oracle的凭证

postgres=# create user mapping for postgres server oratest_fdw options (user 'hr',password 'hr');

CREATE USER MAPPING

--创建外部表

postgres=# create foreign table fdw_t1(name varchar(100),amount numeric(12),update_time timestamp(6) server oratest_fdw options (schema 'HR',table 'T1',readonly 'false');

CREATE FOREIGN TABLE

postgres=# \d

List of relations

Schema | Name | Type | Owner

--------+-------------------------+---------------+----------

public | fdw_t1 | foreign table | postgres

public | pg_stat_statements | view | postgres

public | pg_stat_statements_info | view | postgres

(3 rows)

postgres=# select * from fdw_t1;

name | amount | update_time

-------+--------+---------------------

B | 88888 | 2026-05-11 16:53:28

c | 222 | 2026-05-11 17:02:43

d | 777 | 2026-05-11 17:37:02

aaaaa | 99 | 2026-05-12 09:27:24

(4 rows)

#支持一键导入所有表、视图和物化视图

postgres=# IMPORT FOREIGN SCHEMA "HR" FROM SERVER oratest_fdw INTO public OPTIONS (case 'lower');

IMPORT FOREIGN SCHEMA

postgres=# \d

List of relations

Schema | Name | Type | Owner

--------+-------------------------+---------------+----------

public | all_case_info | foreign table | postgres

public | countries | foreign table | postgres

public | departments | foreign table | postgres

public | emp_details_view | foreign table | postgres

public | employees | foreign table | postgres

public | fdw_t1 | foreign table | postgres

public | job_history | foreign table | postgres

public | jobs | foreign table | postgres

public | locations | foreign table | postgres

public | pg_stat_statements | view | postgres

public | pg_stat_statements_info | view | postgres

public | regions | foreign table | postgres

public | t1 | foreign table | postgres

public | t11 | foreign table | postgres

public | t_time | foreign table | postgres

(15 rows)

#其他运维

--查看所有映射表

postgres=# select * from pg_foreign_table ;

ftrelid | ftserver | ftoptions

---------+----------+-------------------------------------

17232 | 17227 | {schema=HR,table=T1,readonly=false}

17286 | 17227 | {schema=HR,table=ALL_CASE_INFO}

17290 | 17227 | {schema=HR,table=COUNTRIES}

17294 | 17227 | {schema=HR,table=DEPARTMENTS}

17299 | 17227 | {schema=HR,table=EMPLOYEES}

17307 | 17227 | {schema=HR,table=EMP_DETAILS_VIEW}

17316 | 17227 | {schema=HR,table=JOBS}

17321 | 17227 | {schema=HR,table=JOB_HISTORY}

17328 | 17227 | {schema=HR,table=LOCATIONS}

17333 | 17227 | {schema=HR,table=REGIONS}

17337 | 17227 | {schema=HR,table=T1}

17340 | 17227 | {schema=HR,table=T11}

17343 | 17227 | {schema=HR,table=T_TIME}

(13 rows)

--查看已创建的oracle链接

postgres=# SELECT * from pg_user_mappings;

umid | srvid | srvname | umuser | usename | umoptions

-------+-------+-------------+--------+----------+-----------------------

17228 | 17227 | oratest_fdw | 10 | postgres | {user=hr,password=hr}

(1 row)

-- 删除创建的对象

drop foreign table fdw_t1;

drop user mapping for postgres server oratest_fdw;

drop server oratest_fdw;

--查看server对象

postgres=# SELECT * FROM pg_foreign_server;

oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions

-------+-------------+----------+--------+---------+------------+-----------------------+-----------------------------------------

17227 | oratest_fdw | 10 | 17226 | | | {postgres=U/postgres} | {dbserver=192.192.103.111:1521/oratest}

(1 row)

--修改IP或端口

alter server oratest_fdw options(set dbserver '192.168.6.10:1521/oradb');

--修改连接用户密码

alter user mapping for postgres server ora_fdw options (set user 'user',set password '**');

--创建外部表的三种映射方式

--- 简单映射

CREATE FOREIGN TABLE ora_employees (

emp_id integer OPTIONS (key 'true'),

emp_name varchar(100),

hire_date timestamp,

salary numeric(10,2)

) SERVER oratest_fdw OPTIONS (schema 'HR', table 'EMPLOYEES');

--- 选择性列映射

CREATE FOREIGN TABLE ora_dept (

dept_id integer,

dept_name varchar(50)

) SERVER oratest_fdw OPTIONS (

schema 'HR',

table 'DEPARTMENTS',

only_cols 'dept_id, dept_name'

);

--- 表分区映射

CREATE FOREIGN TABLE ora_sales_part (

sale_id integer,

sale_date date,

amount numeric

) SERVER oratest_fdw OPTIONS (

schema 'SH',

table 'SALES',

partition 'SALES_Q1_2023'

);

相关推荐
秉承初心5 小时前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
IvorySQL9 小时前
PostgreSQL 技术日报 (6月15日)|PG19 性能优化推进,POSETTE 大会倒计时 2 天
数据库·人工智能·postgresql·开源
IvorySQL11 小时前
PostgreSQL 技术日报 (6月16日)|Neon 自动化再进一步,逻辑复制冲突日志迎来 v50 更新
数据库·postgresql·自动化
倒流时光三十年11 小时前
PostgreSQL 聊一下索引和排序规则
postgresql
睡不醒男孩0308231 天前
PostgreSQL 数据库运维转型:从传统模式到 CLup 平台的 25 个核心 FAQ
运维·数据库·postgresql
JOJO数据科学1 天前
pgAdmin4 Electron 鸿蒙 PC 适配全记录:从白屏到连接 PostgreSQL
postgresql·electron·harmonyos
日取其半万世不竭1 天前
PostgreSQL 跑在 Docker 里怎么备份?恢复成功才算备份成功
数据库·docker·postgresql
倒流时光三十年1 天前
PostgreSQL LEAST 表达式函数详解
数据库·postgresql
Rain5091 天前
2.4. PostgreSQL 数据库连接与实战指南
前端·数据库·人工智能·后端·postgresql·数据分析
倒流时光三十年2 天前
PostgreSQL CASE 条件表达式详解
数据库·postgresql