PostgreSQL9.5:IMPORT FOREIGN SCHEMA

PostgreSQL 9.5 Alpha 版都已经出来近一个月了,新增了不少重量级的功能,最近比较忙,一直没空来测, 挤点时间,测着玩下。以后博客更新不会像之前频繁,好在现在了解 PG 或者对 PG 有兴趣的人越来越多,而且阿里云也上了 PG 的 RDS, 还希望大家多写博客分享,推动 PG 的中文化。

之前版本 PG 在定义外部表时需要一张一张表定义,例如:

1
2
3
4
5
CREATE FOREIGN TABLE ft_test_1 (  
id integer ,
name text )
SERVER pgsql_srv
OPTIONS (schema_name 'francs', table_name 'test_1');

假如源库有多张表,那么这样定义比较费力而且容易出错,记得之前做一个 MySQL 转 PG 的项目,MySQL 库不大, 100 来 GB 左右,表总数在 40 张左右,不包含分区表,当初这个项目的数据迁移是通过 mysql_fdw 外部表来做的,虽然只有 40 来张表,脚本量却很大,实施起来也费劲,好在当初经过多次测试,在项目组配合下最终完成了这个项目。

闲话少说,PostgreSQL 9.5 版本可以通过一个命令定义源库所有外部表,如下:

1
2
3
4
5
IMPORT FOREIGN SCHEMA remote_schema  
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]

备注:接着实验演示。

环境准备

创建建用户

1
CREATE ROLE fdb LOGIN ENCRYPTED PASSWORD 'fdb' nosuperuser noinherit nocreatedb nocreaterole ;

创建表空间

1
2
mkdir -p /database/pg95/pg_tbs/tbs_fdb_card  
create tablespace tbs_fdb_card owner postgres LOCATION '/database/pg95/pg_tbs/tbs_fdb_card';

创建数据库

1
CREATE DATABASE fdb WITH OWNER = postgres TEMPLATE = template0 ENCODING =  'UTF8' TABLESPACE = tbs_fdb_card;

赋权

1
grant all on database fdb to fdb with grant option;

创建模式

1
2
/c fdb fdb  
create schema fdb;

服务器上另一个版本为 pg9.3.3 实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[pg95@db1 ~]$ psql -h 127.0.0.1  -p 1921 francs francs  
psql (9.5alpha1, server 9.3.3)
Type "help" for help.

francs=> /dt+
List of relations
Schema | Name | Type | Owner | Size | Description
--------+----------------+-------+--------+------------+-------------
francs | events | table | francs | 8192 bytes |
francs | invoice_items | table | francs | 8192 bytes |
francs | mkt_bean_shell | table | francs | 16 kB |
francs | order_sn | table | francs | 0 bytes | 订单号表
francs | tbl_user_json | table | francs | 26 MB |
francs | test_1 | table | francs | 3960 kB |
francs | test_2 | table | francs | 16 kB |
francs | test_3 | table | francs | 16 kB |
francs | test_4 | table | francs | 16 kB |
francs | test_bytea | table | francs | 16 kB |
francs | test_count | table | francs | 0 bytes |
francs | test_dup | table | francs | 8192 bytes |
francs | test_time1 | table | francs | 8192 bytes |
francs | test_time2 | table | francs | 8192 bytes |
francs | test_trash | table | francs | 5912 kB |
francs | user_ini | table | francs | 12 MB |
(16 rows)

备注:目标在 pg 9.5 实例上创建到 pg9.3.3 的外部表。

创建外部表

创建外部服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fdb=# create extension postgres_fdw ;  
CREATE EXTENSION

fdb=# grant usage on foreign data wrapper postgres_fdw to fdb;
GRANT

fdb=# /c fdb fdb
You are now connected to database "fdb" as user "fdb".

fdb=> CREATE SERVER pgsql_srv FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', port '1921', dbname 'francs');
CREATE SERVER

fdb=> CREATE USER MAPPING FOR fdb SERVER pgsql_srv OPTIONS (user 'francs', password 'francs');
CREATE USER MAPPING

9.5 之前版本: 创建外部表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE FOREIGN TABLE ft_test_1 (  
id integer ,
name text )
SERVER pgsql_srv
OPTIONS (schema_name 'francs', table_name 'test_1');

fdb=> select * from ft_test_1 limit 1;
id | name
----+------
1 | 1a
(1 row)

fdb=> select count(*) from ft_test_1;
count
--------
100000
(1 row)

9.5 版本: 一次性创建源库所有外部表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fdb=> drop foreign table ft_test_1;  
DROP FOREIGN TABLE

fdb=> IMPORT FOREIGN SCHEMA francs FROM SERVER pgsql_srv INTO fdb;
IMPORT FOREIGN SCHEMA

fdb=> /dE
List of relations
Schema | Name | Type | Owner
--------+----------------+---------------+-------
fdb | events | foreign table | fdb
fdb | invoice_items | foreign table | fdb
fdb | mkt_bean_shell | foreign table | fdb
fdb | order_sn | foreign table | fdb
fdb | tbl_user_json | foreign table | fdb
fdb | test_1 | foreign table | fdb
fdb | test_2 | foreign table | fdb
fdb | test_3 | foreign table | fdb
fdb | test_4 | foreign table | fdb
fdb | test_bytea | foreign table | fdb
fdb | test_count | foreign table | fdb
fdb | test_dup | foreign table | fdb
fdb | test_time1 | foreign table | fdb
fdb | test_time2 | foreign table | fdb
fdb | test_trash | foreign table | fdb
fdb | user_ini | foreign table | fdb
(16 rows)

备注:太棒了!

IMPORT FOREIGN SCHEMA 更多功能

5.1 过滤功能

1
2
3
IMPORT FOREIGN SCHEMA public  
EXCEPT (reports, audit)
FROM SERVER dest_server INTO remote;

5.2 指定某些表

1
2
3
IMPORT FOREIGN SCHEMA public  
LIMIT TO (customers, purchases)
FROM SERVER dest_server INTO remote;

备注:这两个功能暂未测试,有兴趣的朋友可以测试下。

参考

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/239626.html

(0)
上一篇 2022年2月12日
下一篇 2022年2月12日

相关推荐

发表回复

登录后才能评论