PostgreSQL通过Oracle_FDW连通Oracle实战

📢📢📢📣📣📣

作者:IT邦德

中国DBA联盟(ACDU)成员,15年DBA工作经验

Oracle、PostgreSQL ACE

CSDN博客专家及B站知名UP主,全网粉丝15万+

擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,

安装迁移,性能优化、故障应急处理

文章目录

Oracle_FDW是PostgreSQL的一个外部数据包装器扩展,它遵循SQL/MED(SQL Management of External Data)标准。通过使用此扩展,PostgreSQL可以跨库查询Oracle数据库中的表,甚至执行增删改操作,实现了类似dblink的功能,但通常具有更好的性能和易用性。更重要的是,它可以方便地实现PostgreSQL与Oracle之间的数据同步,为企业的数据整合和迁移提供技术支撑。

1. 下载安装包

从GitHub或PGXN网站下载Oracle_FDW源码包,Oracle_fdw的编译依赖系统中需要有pg_config和Oracle的环境。

Oracle_FDW下载地址

https://pgxn.org/dist/oracle_fdw/

oracle客户端下载地址

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

2. 创建创Oracle环境

复制代码
mkdir /oracle
chown postgres:postgres /oracle
chmod 775 /oracle

--举例解压19C
su - postgres
cd /oracle
unzip /opt/instantclient-basic-linux.x64-19.29.0.0.0dbru.zip -d ./
unzip /opt/instantclient-sdk-linux.x64-19.29.0.0.0dbru.zip -d ./
unzip /opt/instantclient-sqlplus-linux.x64-19.29.0.0.0dbru.zip -d ./

--配置环境变量
vi ~/.bash_profile

export ORACLE_HOME=/oracle/instantclient_19_29
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

source .bash_profile

3. 安装ORACLE_FDW插件

unzip /opt/oracle_fdw-2.8.0.zip -d /home/postgres

cd oracle_fdw-2.8.0

make && make install

4.创建外部数据封装器

yum install libnsl

postgres=# CREATE EXTENSION oracle_fdw;

5.创建外部服务器

复制代码
postgres=# create server ora_fdw foreign data wrapper oracle_fdw options(dbserver '192.168.6.10:1521/oradb');

--修改IP及端口
alter server ora_fdw options(set dbserver '192.168.6.10:1521/oradb');

授权使用的用户
grant usage on foreign server ora_fdw to postgres;

创建用户映射,连接oracle的凭证
postgres=# CREATE USER MAPPING FOR postgres SERVER ora_fdw OPTIONS (user 'orauser', password 'oracle');

修改连接用户密码
alter user mapping for postgres server ora_fdw options (set user 'user',set password '**');

6.创建外部表

复制代码
create foreign table fdw_emp(
EMPNO integer options(key 'true') not null,
ENAME varchar(10),
JOB varchar(10),
MGR integer,
HIREDATE date,
SAL numeric(7,2),
COMM numeric(7,2),
DEPTNO integer
) server ora_fdw options (schema 'SCOTT',table 'EMP',readonly 'false');

注:integer OPTIONS (key 'true') NOT NULL是 oracle_fdw插件中用于定义外部表的关键语法,
它主要作用是标识该列映射自 Oracle 源表的主键,
从而启用对 Oracle 数据的修改功能。

readonly:可以限制Oracle表为只读,
不允许INSERT、UPDATE、DELETE操作。

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

--导入语法:

IMPORT FOREIGN SCHEMA <ora_schema_name>

FROM SERVER <server_name>

INTO <schema_name>

OPTIONS (case 'lower');

7.查看外部表信息

postgres=# select oracle_diag();

postgres=# select oracle_diag();select * from fdw_emp;

增删改外部表,要求一定有主键,外部表主键设置options(key 'true')

复制代码
insert into fdw_emp (empno,ename,job,sal,deptno) values(6666,'IT','DBA',1000,10);
delete from fdw_emp where empno=6666;
update fdw_emp set comm=20000 where empno=7934;

8.其他运维语句

复制代码
-- 查询已创建的到oracle的连接
SELECT * from pg_user_mappings;

-- 删除创建的对象
drop foreign table fdw_emp;
drop user mapping for postgres server ora_fdw;
drop server ora_fdw;
--查看server对象
SELECT * FROM pg_foreign_server;
SELECT s.srvname, w.fdwname, s.srvoptions
FROM pg_foreign_server s
JOIN pg_foreign_data_wrapper w ON w.oid = s.srvfdw;

结语

与传统的ETL工具不同,Oracle_FDW提供了一种"实时"的数据访问方式。当您查询外部表时,PostgreSQL会将查询请求发送给Oracle数据库,在Oracle端执行相应的操作,然后将结果返回给PostgreSQL。这种方式确保您总是获取到最新的数据,而无需进行定期的数据抽取和导入。

相关推荐
泡海椒17 小时前
JQuick-SQL JOIN 查询:连接注册数据集的正确方式
数据库·sql
xiaogai_gai17 小时前
钉钉月结报销到金蝶付款单同步方案实战教程
大数据·数据库·钉钉
Nturmoils17 小时前
报表总在扫大表,列存储应该放在哪一层
数据库
夜雪一千18 小时前
ShardingSphere 雪花 / UUIDv7 主键分片实战 + SQL 建表示例
数据库·sql
Elastic 中国社区官方博客18 小时前
Elasticsearch:安装自行管理的 Elastic Stack 集群
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索
PingCAP19 小时前
Agent 从 Demo 到生产,到底卡在哪?
数据库·tidb·agent
SelectDB20 小时前
开源替代怎么选:能力对照、三条部署路径与四类边界速查
数据库·云原生·开源
SelectDB20 小时前
自建与托管怎么选:开源自建、私有化与云上托管三条路径速查
数据库·云原生·开源
这个DBA有点耶20 小时前
深入 OLTP 锁与并发:从行锁到分布式事务的一致性权衡
数据库·架构·产品
SelectDB20 小时前
数仓 TCO 怎么算:五项成本拆解框架速查
大数据·数据库·开源