PostgreSQL 9.5 使用 import foreign schema 语法一键创建外部表

PostgreSQL 9.5提供了一个快捷的将远程数据库中的表,视图或物化视图转换成外部表的方式, 使用import foreign schema可以直接将远端的整个schema中的所有表或部分表直接创建在本地的某个指定的schema下.

Command:     IMPORT FOREIGN SCHEMA
Description: import table definitions from a foreign server
Syntax:
IMPORT FOREIGN SCHEMA remote_schema
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]

测试 :
remote db postgresql 9.4.1

postgres=# create schema rmt;
CREATE SCHEMA
postgres=# create table rmt(id int, info text, crt_time timestamp);
CREATE TABLE
postgres=# create table rmt1(id int, info text, crt_time timestamp);
CREATE TABLE
postgres=# create table rmt2(id int, info text, crt_time timestamp);
CREATE TABLE  

postgres=# insert into rmt select generate_series(1,100000), md5(random()::text), clock_timestamp();
INSERT 0 100000
postgres=# insert into rmt1 select generate_series(1,100000), md5(random()::text), clock_timestamp();
INSERT 0 100000
postgres=# insert into rmt2 select generate_series(1,100000), md5(random()::text), clock_timestamp();
INSERT 0 100000
postgres=# alter table rmt add constraint pk primary key (id);
ALTER TABLE
postgres=# alter table rmt add constraint ck check (length(info)>1);
ALTER TABLE  

postgres=# alter table rmt set schema rmt;
ALTER TABLE
postgres=# alter table rmt1 set schema rmt;
ALTER TABLE
postgres=# alter table rmt2 set schema rmt;
ALTER TABLE
postgres=# \dt rmt.*
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 rmt    | rmt  | table | postgres
 rmt    | rmt1 | table | postgres
 rmt    | rmt2 | table | postgres
(3 rows)

local db postgresql 9.5

postgres=# create extension postgres_fdw;
CREATE EXTENSION
postgres=# create server rmt foreign data wrapper postgres_fdw options (hostaddr '127.0.0.1', port '1921', dbname 'postgres');
CREATE SERVER
postgres=# create user mapping for postgres server rmt options (user 'postgres', password 'postgres');
CREATE USER MAPPING  

postgres=# create schema r1;
CREATE SCHEMA
postgres=# import FOREIGN SCHEMA rmt from server rmt into r1 ;
IMPORT FOREIGN SCHEMA  

postgres=# \det+
                             List of foreign tables
 Schema | Table | Server |              FDW Options               | Description
--------+-------+--------+----------------------------------------+-------------
 r1     | rmt   | rmt    | (schema_name 'rmt', table_name 'rmt')  |
 r1     | rmt1  | rmt    | (schema_name 'rmt', table_name 'rmt1') |
 r1     | rmt2  | rmt    | (schema_name 'rmt', table_name 'rmt2') |
(3 rows)  

postgres=# \d r1.rmt
                            Foreign table "r1.rmt"
  Column  |            Type             | Modifiers |       FDW Options
----------+-----------------------------+-----------+--------------------------
 id       | integer                     | not null  | (column_name 'id')
 info     | text                        |           | (column_name 'info')
 crt_time | timestamp without time zone |           | (column_name 'crt_time')
Server: rmt
FDW Options: (schema_name 'rmt', table_name 'rmt')  

postgres=# select count(*) from r1.rmt1;
 count
--------
 100000
(1 row)  

postgres=# select count(*) from r1.rmt;
 count
--------
 100000
(1 row)  

postgres=# select count(*) from r1.rmt2;
 count
--------
 100000
(1 row)

还可以使用limit to或者except来控制只导某些表, 或排除某些表.

postgres=# drop foreign table r1.rmt;
DROP FOREIGN TABLE
postgres=# drop foreign table r1.rmt1;
DROP FOREIGN TABLE
postgres=# drop foreign table r1.rmt2;
DROP FOREIGN TABLE  

postgres=# import FOREIGN SCHEMA rmt limit to (rmt) from server  rmt into r1 ;
IMPORT FOREIGN SCHEMA
postgres=# \det+
                            List of foreign tables
 Schema | Table | Server |              FDW Options              | Description
--------+-------+--------+---------------------------------------+-------------
 r1     | rmt   | rmt    | (schema_name 'rmt', table_name 'rmt') |
(1 row)  

postgres=# drop foreign table r1.rmt;
DROP FOREIGN TABLE
postgres=# import FOREIGN SCHEMA rmt except (rmt) from server  rmt into r1 ;
IMPORT FOREIGN SCHEMA
postgres=# \det+
                             List of foreign tables
 Schema | Table | Server |              FDW Options               | Description
--------+-------+--------+----------------------------------------+-------------
 r1     | rmt1  | rmt    | (schema_name 'rmt', table_name 'rmt1') |
 r1     | rmt2  | rmt    | (schema_name 'rmt', table_name 'rmt2') |
(2 rows)

注意, 导入时会同时将视图, 物化视图, 外部表都一并导入, 除非使用except来排除.
remote db postgresql 9.4.1

postgres=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | rt1  | table | postgres
 public | rt2  | table | postgres
 public | tbl  | table | postgres
 public | test | table | postgres
(4 rows)
postgres=# \dn
  List of schemas
  Name  |  Owner
--------+----------
 public | postgres
 rmt    | postgres
(2 rows)
postgres=# create view rmt.v1 as select * from test;
CREATE VIEW
postgres=# \dv rmt.*
        List of relations
 Schema | Name | Type |  Owner
--------+------+------+----------
 rmt    | v1   | view | postgres
(1 row)
postgres=# create server rmt foreign data wrapper postgres_fdw options (hostaddr '127.0.0.1', port '1921', dbname 'postgres');
CREATE SERVER
postgres=# create user mapping for postgres server rmt options (user 'postgres', password 'postgres');
CREATE USER MAPPING
postgres=# create foreign table rmt.ft1 (id int, info text) server rmt options (schema_name 'public', table_name 'test');
CREATE FOREIGN TABLE
postgres=# SELECT id, info FROM rmt.ft1;
  id  | info
------+-------
    1 | test1
    2 | test2
    3 | test2
    4 | test2
    5 | test2
    6 | test2
    7 | test2
    8 | test3
  100 | test3
 1000 | test4
    2 | test2
    2 | test2
    2 | test2
(13 rows)

local db postgresql 9.5
导入时会同时将视图, 物化视图, 外部表都一并导入, 除非使用except来排除.

postgres=# drop foreign table r1.rmt1;
DROP FOREIGN TABLE
postgres=# drop foreign table r1.rmt2;
DROP FOREIGN TABLE
postgres=# import FOREIGN SCHEMA rmt except (rmt) from server  rmt into r1 ;
IMPORT FOREIGN SCHEMA
postgres=# \det+
                             List of foreign tables
 Schema | Table | Server |              FDW Options               | Description
--------+-------+--------+----------------------------------------+-------------
 r1     | ft1   | rmt    | (schema_name 'rmt', table_name 'ft1')  |
 r1     | rmt1  | rmt    | (schema_name 'rmt', table_name 'rmt1') |
 r1     | rmt2  | rmt    | (schema_name 'rmt', table_name 'rmt2') |
 r1     | v1    | rmt    | (schema_name 'rmt', table_name 'v1')   |
(4 rows)
postgres=# select * from r1.v1;
  id  | info
------+-------
    1 | test1
    2 | test2
    3 | test2
    4 | test2
    5 | test2
    6 | test2
    7 | test2
    8 | test3
  100 | test3
 1000 | test4
    2 | test2
    2 | test2
    2 | test2
(13 rows)
postgres=# select * from r1.ft1;
  id  | info
------+-------
    1 | test1
    2 | test2
    3 | test2
    4 | test2
    5 | test2
    6 | test2
    7 | test2
    8 | test3
  100 | test3
 1000 | test4
    2 | test2
    2 | test2
    2 | test2
(13 rows)

最后需要注意的是, 目前只有postgres_fdw支持import FOREIGN SCHEMA语法, 其他fdw需要自己去实现.

[参考]

1. http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=59efda3e50ca4de6a9d5aa4491464e22b6329b1e
Implement IMPORT FOREIGN SCHEMA.  

This command provides an automated way to create foreign table definitions
that match remote tables, thereby reducing tedium and chances for error.
In this patch, we provide the necessary core-server infrastructure and
implement the feature fully in the postgres_fdw foreign-data wrapper.
Other wrappers will throw a "feature not supported" error until/unless
they are updated.  

Ronan Dunklau and Michael Paquier, additional work by me
2. http://www.postgresql.org/docs/devel/static/sql-importforeignschema.html
3. http://blog.163.com/digoal@126/blog/static/163877040201521162114359/  
时间: 2024-11-17 10:15:17

PostgreSQL 9.5 使用 import foreign schema 语法一键创建外部表的相关文章

PostgreSQL 使用函数生成 外部表DDL

如果要生成大量的外部表, 写代码闲麻烦的话, PostgreSQL 9.5 可以通过import foreign schema 一键创建外部表, 以前的版本则可以通过如下方法快速的生成外部表的DDL. 创建postgresql外部表fdw postgres=# create extension postgres_fdw; CREATE EXTENSION 创建server, 指定远端数据库的ip, port, dbname postgres=# create server fs foreign

PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)

标签 PostgreSQL , Linux , CentOS 背景 新用户部署PostgreSQL以及空间数据库插件PostGIS的指南. 内网环境RPM打包(可选项) 如果是内网环境,可以将包全部下载到本地再用rpm安装. 安装epel和postgresql yum rpm两个包后再执行: 1.使用yum-utils的yumdownloader下载需要的安装包,包括依赖包. yum install -y yum-utils yumdownloader --resolve --destdir=/

阿里云RDS PostgreSQL OSS 外部表 - 并行写提速案例

标签 PostgreSQL , oss对象存储 , 阿里云RDS PG , 并行写 , dblink , 异步调用 , 异步任务监控 , OSS外部表 , 数据传输 背景 阿里云RDS PostgreSQL.HybridDB for PostgreSQL提供了一个非常强大的功能,OSS对象存储外部表. 阿里云的RDS PostgreSQL用户可以利用OSS存储冷数据(OSS外部表的形态呈现),实现冷热分离:也可以利用OSS作为数据的中转桥梁,打通其他云端业务,例如HDB FOR PostgreS

PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合

title: PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合 author: 义从 前言 大家都知道,PostgreSQL 近几大版本中加入了很多 OLAP 相关特性.9.6 的并行扫描应该算最大的相关特性.在今年发布的 10.0 中,并行扫描也在不断加强,新增了并行的索引扫描. 我们知道并行扫描是支持外部数据源的.在云上,有很多存储存储产品可以以外部数据源的形式做数据库的外部存储.例如,阿里云的 OSS 和 AWS 的 S3 都是绝佳的外部数据源

用 INNER JOIN语法联接多个表建记录集

记录集|语法 用 INNER JOIN语法联接多个表建记录集 多表联接建立记录集是十分有用的,因为某些情况下,我们需要把数字数据类型显示为相应的文本名称,这就遇到了多表联接建立记录集的问题.比如作一个会员注册系统,共有五个表,会员信息数据表member.会员身份表MemberIdentity.会员权限表MemberLevel.会员类别表MemberSort和会员婚姻状况表Wedlock.如果想把会员注册信息全部显示出来,肯定要将这四个表连起来,否则大家看到的某些会员信息可能只是数据编号.   

HTAP数据库 PostgreSQL 场景与性能测试之 35 - (OLTP+OLAP) 含索引单表单点写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 37 - (OLTP+OLAP) 含索引单表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 39 - (OLTP+OLAP) 含索引多表单点写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 41 - (OLTP+OLAP) 含索引多表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos