阿里云rds PG, PPAS PostgreSQL 同实例,跨库数据传输、访问(postgres_fdw 外部表)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 标签 PostgreSQL , 阿里云rds , pg , ppas , 跨库查询 , 外部表 , postgres_fdw 背景 如果你使用pg或ppas作为实时数仓,并且有跨库数据传输(ods, dw, dm 分层结构)的需求,可以使用postgres_fdw外部表实现,不需要使用ETL工具对数据进行抽取和导入这种无用功操作。 postgres_fdw是PG的一个外部表插件,可读,

标签

PostgreSQL , 阿里云rds , pg , ppas , 跨库查询 , 外部表 , postgres_fdw


背景

如果你使用pg或ppas作为实时数仓,并且有跨库数据传输(ods, dw, dm 分层结构)的需求,可以使用postgres_fdw外部表实现,不需要使用ETL工具对数据进行抽取和导入这种无用功操作。

postgres_fdw是PG的一个外部表插件,可读,可写。同时支持条件下推,性能很不错。

实际上PG的FDW是一个模块,不仅支持PG外部表,还能够支持mongo, oracle, mysql, mssql等等几乎地球上所有的外部数据源(例如阿里的OSS数据源),因此你可以在PG数据库中直接访问这些数据源的数据,就如同访问PG的本地表一样方便。

例子

以阿里云RDS pg为例

1、在本地库创建插件

postgres=# create extension postgres_fdw;    
CREATE EXTENSION    

2、得到RDS当前数据库端口:

postgres=# show port;    
 port     
------    
 1921    
(1 row)    

3、在本地库创建外部库的server,取个名字,例如foreign_server,定义外部库的连接

CREATE SERVER foreign_server    
        FOREIGN DATA WRAPPER postgres_fdw    
        OPTIONS (host '127.0.0.1', port '1921', dbname 'digoal');    

4、在目标库(远端库),创建测试表

digoal=# create table test1 (id int, info text, crt_time timestamp);    
CREATE TABLE    
digoal=# create table test2 (id int, info text, crt_time timestamp);    
CREATE TABLE    
digoal=# create table test3 (id int, info text, crt_time timestamp);    
CREATE TABLE    
digoal=# insert into test1 select generate_series(1,1000000), md5(random()::text), now();    
INSERT 0 1000000    
digoal=# insert into test2 select generate_series(1,1000000), md5(random()::text), now();    
INSERT 0 1000000    
digoal=# insert into test3 select generate_series(1,1000000), md5(random()::text), now();    
INSERT 0 1000000    

5、在目标库,创建数据库用户

digoal=# create role r1 login encrypted password '1234';    
CREATE ROLE    

6、将需要被访问的表的权限赋予给这个用户

digoal=# grant all on table test1 to r1;    
GRANT    
digoal=# grant all on table test2 to r1;    
GRANT    
digoal=# grant all on table test3 to r1;    
GRANT    

7、在本地库,创建认证映射关系

例如本地用户postgres通过r1用户连接foreign_server 外部server.

CREATE USER MAPPING FOR postgres    
        SERVER foreign_server    
        OPTIONS (user 'r1', password '1234');    

8、在本地库创建外部表

CREATE FOREIGN TABLE ft_test1 (    
        id int,    
        info text,    
	crt_time timestamp    
)    
        SERVER foreign_server    
        OPTIONS (schema_name 'public', table_name 'test1');    

9、在本地库,导入远程表到本地,性能

postgres=# create table lt_test1 (id int, info text, crt_time timestamp);    
CREATE TABLE    
postgres=# \timing    
Timing is on.    
postgres=# insert into lt_test1 select * from ft_test1;    
INSERT 0 1000000    
Time: 3102.742 ms (00:03.103)    

支持条件下推

postgres=# explain verbose select * from ft_test1 where id=111;    
                                  QUERY PLAN                                      
------------------------------------------------------------------------------    
 Foreign Scan on public.ft_test1  (cost=100.00..103.04 rows=6 width=44)    
   Output: id, info, crt_time    
   Remote SQL: SELECT id, info, crt_time FROM public.test1 WHERE ((id = 111))    
(3 rows)    
    
Time: 1.199 ms    

10、将本地数据写入远端

postgres=# explain verbose insert into ft_test1 select * from lt_test1;    
                                   QUERY PLAN                                       
--------------------------------------------------------------------------------    
 Insert on public.ft_test1  (cost=0.00..322.76 rows=1000000 width=45)    
   Remote SQL: INSERT INTO public.test1(id, info, crt_time) VALUES ($1, $2, $3)    
   ->  Seq Scan on public.lt_test1  (cost=0.00..322.76 rows=1000000 width=45)    
         Output: lt_test1.id, lt_test1.info, lt_test1.crt_time    
(4 rows)    
    
postgres=# insert into ft_test1 select * from lt_test1;    
INSERT 0 1000000    
Time: 44294.740 ms (00:44.295)    

11、如果要一次创建远端某个SCHEMA下的所有表到本地的某个SCHEMA中作为外部表,可以使用import语法。

首先在本地创建一个SCHEMA,用于存放远端schema的表的外部表。

create schema ft;  

使用import语法将远端public schema下的所有表,定义到本地的ft schema中

postgres=# import foreign schema public from server foreign_server INTO ft;    
IMPORT FOREIGN SCHEMA    
postgres=# \det ft.*    
     List of foreign tables    
 Schema | Table |     Server         
--------+-------+----------------    
 ft     | test1 | foreign_server    
 ft     | test2 | foreign_server    
 ft     | test3 | foreign_server    
(3 rows)    

参考

https://www.postgresql.org/docs/11/postgres-fdw.html

 

免费领取阿里云RDS PostgreSQL实例、ECS虚拟机

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
622 0
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
5月前
|
缓存 分布式计算 BI
阿里云数据传输服务使用场景
阿里云数据传输服务(DTS)的核心优势在于其支持多种数据传输方式(迁移、同步、订阅),能够满足企业在数据库迁移、灾备、实时数仓构建、业务解耦等场景下的需求。无论是优化用户体验、降低使用成本,还是实现跨账号任务授权,DTS均提供了完整的解决方案
|
人工智能 关系型数据库 MySQL
基于阿里云的PolarDB MySQL版实现AI增强数据管理
本文将介绍如何利用阿里云的PolarDB MySQL版结合AI技术,实现数据管理的自动化和智能化。
977 0
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
584 6
|
NoSQL Redis 监控
Redis常用命令指南
Redis常用命令指南
683 1
Redis常用命令指南
|
安全 数据管理 关系型数据库
数据管理DMS使用问题之使用香港地区的RDS,如何通过代理进行访问
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
数据管理DMS使用问题之使用香港地区的RDS,如何通过代理进行访问
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何进行PostgreSQL(简称PG)的全量和增量备份管理
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
关系型数据库 Serverless 数据库
函数计算产品使用问题之如何访问阿里云的RDS
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
202 1

热门文章

最新文章

推荐镜像

更多