IMPORT FOREIGN SCHEMA
功能描述
Vastbase在PostgreSQL兼容模式下支持IMPORT FOREIGN SCHEMA
语法,用于从外部服务器中导入表定义。
IMPORT FOREIGN SCHEMA
将会在本地创建存在于外部服务器上的表的外部表,导入时需要指定已存在的远端schema和本地schema的名称。默认情况下,存在于外部服务器上一个特定模式中的所有表和视图(包括物化视图)都会被导入。
支持指定要导入的表或排除schema中特定的表。
注意事项
上述功能仅在数据库兼容模式为PostgreSQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。
若导入的远端表名与指定的本地schema中已存在的表名相同,则导入失败,回退整个操作。
IMPORT FOREIGN SCHEMA
需要结合外部数据封装器使用,以访问远程数据库中的数据。当前仅支持结合postgres_fdw使用,不支持其他外部数据封装器。
IMPORT FOREIGN SCHEMA
允许使用的远端数据源可以是postgres_fdw能连接到的任何外部服务器。要使用
IMPORT FOREIGN SCHEMA
,用户必须具有外部服务器上的USAGE权限以及目标模式上的CREATE权限。执行
IMPORT FOREIGN SCHEMA
命令的用户即为新创建外部表的属主。通过
IMPORT FOREIGN SCHEMA
命令导入的外部表数据支持逻辑备份和物理备份。支持基于分区表创建postgres foreign table下的相关SQL,前提是参数sql_beta_feature已指定了'partition_fdw_on'特性。
语法格式
IMPORT FOREIGN SCHEMA remote_schema
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]
参数说明
remote_schema
远端schema名称,指要从哪个远程模式导入。
LIMIT TO ( table_name [, …] )
只导入匹配了给定表名table_name的外部表。
EXCEPT ( table_name [, …] )
排除匹配给定表名的外部表,导入远端模式中除了table_name以外的表。
server_name
由CREATE SERVER命令创建的外部服务器的名称,指要从哪个外部服务器导入。
local_schema
指定外部表要导入的本地模式的名称。
OPTIONS( option 'value' [, … ] )
要在导入期间使用的选项。允许使用的选项名称和值与使用的外部数据封装器有关。
示例
前置条件: 参考配置服务端远程连接修改远程服务器的相关配置,允许对其进行远程连接。此处给出一种配置方式,修改配置文件后需要重启数据库才能生效。
本示例中本地服务器为172.16.101.01,远端服务器为172.16.101.02。
在172.16.101.02中执行以下命令,向配置文件postgresql.conf中追加内容:
echo "listen_addresses='172.16.101.01'" >> $PGDATA/postgresql.conf
在172.16.101.02中执行以下命令,向配置文件pg_hba.conf中追加内容:
echo "host all all 0.0.0.0/0 md5" >> $PGDATA/pg_hba.conf
以下步骤在远程服务器中执行:
1、在vastbase数据库的public模式下,创建普通表,分区表,普通视图,物化视图。
--创建表
CREATE TABLE tb1_1162331(id_1 name,
id_2 nchar(10),
id_3 varchar(15),
id_4 varchar2(20),
id_5 serial primary key);
insert into tb1_1162331(id_5) values(generate_series(0,100));
CREATE TABLE tb2_1162331(col1 int1,
col2 int2,
col3 int4,
col4 int8,
col5 numeric,
col6 number(3,3),
col7 numeric(5,3),
col8 float4,
col9 float8,
col10 real,
col11 serial,
col12 char(5),
col13 nchar(5),
col14 varchar(10),
col15 varchar2(10),
col16 nvarchar2(10),
col17 char,
col18 varchar,
col19 clob,
col20 text,
col21 name,
col22 date,
col23 time,
col24 timestamp,
col25 smalldatetime,
col26 interval,
col27 interval day(5) to second(3),
col28 reltime,
col29 blob,
col30 raw,
col31 bytea,
col32 money,
col33 boolean,
col34 uuid,
col35 point,
col36 circle,
col37 cidr,
col38 macaddr,
col39 json,
col40 xml,
col41 bit(5),
col42 int[],
col43 numeric[]);
insert into tb2_1162331 values(1,2,3,4,5,0.999,1.23,8,9,10,11,'aaa','bbb','cde',15,16,'9',18,19,20,21,'2000-1-1','00:00:00','2000-1-1','2000-1-1',1,1,'1','1','1','31','32.54',true,'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa','0,0','1,1,36','192.168/24','08002b010203','{"id":1,"name":"lili"}','111/222','10010','{1,1,5}','{43.5,40}');
insert into tb2_1162331 values(2,20,30,40,51,0.999,1.23,8,9,10,11,'aaa','bbb','cde',15,16,'9',18,19,20,21,'2000-1-1','00:00:00','2000-1-1','2000-1-1',1,1,'1','1','1','31','32.54',true,'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa','0,0','1,1,36','192.168/24','08002b010203','{"id":1,"name":"lili"}','111/222','10010','{1,1,5}','{43.5,40}');
CREATE TABLE tb3_1162331 (id int,name varchar)
PARTITION BY RANGE (id)
(PARTITION p1 values less than (50),
PARTITION p2 values less than (100),
PARTITION p3 values less than (maxvalue));
insert into tb3_1162331 values(15,'aaaa');
insert into tb3_1162331 values(105,'ooppodjakhfjkaherouwle');
CREATE TABLE tb4_1162331(id int,name varchar(10))
PARTITION BY HASH (name)
(PARTITION p1,
PARTITION p2);
insert into tb4_1162331 values(1,'???????');
--创建视图
create view v1_1162331 as select * from tb1_1162331;
create view v2_1162331 as select a.id_1,b.col2,b.col3,b.col4 from tb1_1162331 a,tb2_1162331 b;
create view v3_1162331 as select * from tb3_1162331;
create view v4_1162331 as select * from tb4_1162331;
--创建物化视图
create materialized view mv1_1162331 as select id_1 from tb1_1162331;
create materialized view mv2_1162331(id,pid,col3,col4) as select a.id_1,b.col2,b.col3,b.col4 from tb1_1162331 a,tb2_1162331 b;
create materialized view mv3_1162331 as select * from tb3_1162331;
create materialized view mv4_1162331 as select * from tb4_1162331;
--创建增量物化视图
CREATE INCREMENTAL MATERIALIZED VIEW imv1_1162331 AS SELECT * FROM tb1_1162331;
create INCREMENTAL MATERIALIZED VIEW imv2_1162331 as select b.col1,b.col2,col3,col4,col5 from tb2_1162331 b;
2、创建用于远程连接的用户u1_1162331并为其授权。
create user u1_1162331 password 'Admin@123456';
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO u1_1162331;
以下步骤在本地服务器中执行:
1、加载postgres_fdw扩展。
create extension postgres_fdw;
2、创建外部服务器。
create server svr_1162331 foreign data wrapper postgres_fdw options (host'172.16.101.02',port'5432',dbname'vastbase');
3、创建用户到外部服务器的映射,指定该映射使用的用户u1_1162331和口令。
create user mapping for public server svr_1162331 options(user'u1_1162331',password'Admin@123456');
4、将外部服务器public模式中的数据导入到当前数据库的public模式下。导入范围是所有表、视图、物化视图。
import foreign schema public from server svr_1162331 into public;
5、导入成功后,查看外部表的结构,定义,数据。
查看表的结构。
\d+ tb3_1162331;
返回结果如下:
Foreign table "public.tb3_1162331" Column | Type | Modifiers | FDW Options | Storage | Stats target | Description --------+---------+-----------+----------------------+----------+--------------+------------- id | integer | | (column_name 'id') | plain | | name | varchar | | (column_name 'name') | extended | | Server: svr_1162331 FDW Options: (schema_name 'public', table_name 'tb3_1162331') FDW permition: read only Has OIDs: no
查看普通表的数据。
select * from tb1_1162331 where id_5 < 10;
返回结果如下:
id_1 | id_2 | id_3 | id_4 | id_5 -----+------+------+------+------ | | | | 0 | | | | 1 | | | | 2 | | | | 3 | | | | 4 | | | | 5 | | | | 6 | | | | 7 | | | | 8 | | | | 9 (10 rows)
查看物化视图的定义。
select * from pg_get_tabledef('mv1_1162331');
返回结果如下:
pg_get_tabledef ------------------------------------------------------------- SET search_path = public; + CREATE FOREIGN TABLE mv1_1162331 ( + id_1 name + ) + SERVER svr_1162331 + OPTIONS ( + schema_name 'public', + table_name 'mv1_1162331' + ); + ALTER FOREIGN TABLE mv1_1162331 ALTER COLUMN id_1 OPTIONS (+ column_name=id_1 + ); (1 row)
查看分区表的数据。
(1)启用partition_fdw_on特性。
set sql_beta_feature to 'partition_fdw_on';
(2)查看分区表的数据。
select * from tb3_1162331;
返回结果如下:
id | name -----+------------------------ 15 | aaaa 105 | ooppodjakhfjkaherouwle (2 rows)
6、在本地对外部表执行UPDATE操作。
(1)查看表原本的数据。
select id_4 from tb1_1162331 where id_5=0;
返回结果如下:
id_4
------
(1 row)
(2)执行UPDATE操作,修改上一步查到的数据。
update tb1_1162331 set id_4=128 where id_5=0;
(3)查看修改后的数据。
select id_4 from tb1_1162331 where id_5=0;
修改成功,返回结果如下:
id_4
------
128
(1 row)
在本地修改了foreign table的数据后,远端服务器上的结果会同步更新。