1. 概述
postgres_fdw模块提供了外部数据封装器postgres_fdw, 它可以被用来访问存储在外部PostgreSQL服务器中的数据。
这个模块提供的功能基本上覆盖了较老的dblink模块的功能。 但是postgres_fdw提供了更透明且更兼容标准的语法来访问远程表, 并且可以在很多情况下给出更好的性能。
2. 安装
目前PG11版本已经自带postgres_fdw插件,因此不需要主动安装直接可以使用。
3. 创建插件
插件postgres_fdw安装后, 还需要做以下几步,才能保证PG11同一套数据库中两个库互相访问,或者是两套PG11之间互相访问。
3.1. 新建插件
新建postgres_fdw插件命令如下:
Ø create extension postgres_fdw;
给具体PG11数据库创建插件,需要使用超级管理员用户。连接方式pg -d [databasename] -U [superUser]
3.2. 本地创建SERVER
Ø CREATE SERVER <SERVER名称> FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbserver '<数据库地址>',port '<数据库端口>',dbname '<数据库名>');
--列出已经创建的foreign server命令是:\des+
如果port是默认5432可以省略;如果创建成功后,发现OPTIONS中参数有误,可以使用alter server进行修改。具体语句如下:
ALTER SERVER name [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) ]
赋予数据库用户对应权限,用赋权的普通用户创建。
Ø grant usage on foreign data wrapper postgres_fdw to test;
创建server
登录普通用户test用户创建sever:
Ø CREATE SERVER test_dblink FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', dbname 'test011');
修改server信息
Ø ALTER SERVER test_dblink OPTIONS (add port '5432');
Ø ALTER SERVER test_dblink OPTIONS (drop port);
3.3. 创建用户映射
创建用户映射。命令如下,此步一定要进入赋权的用户进行操作,否则创建外部表失败。
Ø CREATE USER MAPPINGFOR <数据库账号> SERVER <映射名> OPTIONS (user '<数据库用户名>', password '<数据库用户密码>');
Ø 如果映射的密码错误可以使用ALTER USER MAPPING语法修改。
ALTER USER MAPPING FOR { user_name | USER | CURRENT_USER | SESSION_USER | PUBLIC }
SERVER server_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )
Ø CREATE USER MAPPING FOR test SERVER test_dblink OPTIONS (user 'test', password 'test@1234');
3.4. 创建外部表
创建PG的外部表。示例如下:
Ø CREATE FOREIGN TABLE <创建Vastbase表名>(<表结构信息>) SERVER <映射名> OPTIONS (table_name '<表名称>', schema_name '<表的模式名称>');
注意:CREATE FOREIGN TABLE中声明的列数据类型和其他性质必须要匹配实际的远程表,列名也必须匹配。
Ø CREATE FOREIGN TABLE test (a int) server test_dblink OPTIONS (schema_name 'public', table_name 'test');
以下是PG11两个库的查询结果:
3.5. 删除创建的对象
Ø drop foreign table <表名称>;
Ø drop user mapping for <用户名> server <SERVER_NAME>;
Ø drop server <SERVER_NAME>; #创建用户删除
Ø DROP EXTENSION <插件名称>; #创建用户删除
3.6. 导入外部表
IMPORT FOREIGN SCHEMA创建表示存在于 外部服务器上的表的外部表。新外部表将由发出该命令的用户所拥有并且用 匹配远程表的正确的列定义和选项创建。
默认情况下,存在于外部服务器上一个特定模式中的所有表和视图都会被导入。根据需要,表的列表可以被限制到一个指定的子集,或者可以排除特定的表。 新外部表都被创建在一个必须已经存在的目标模式中。
要使用IMPORT FOREIGN SCHEMA,用户必 须具有外部服务器上的USAGE特权以及在目标模式上的 CREATE特权。
Ø 语法:
IMPORT FOREIGN SCHEMA remote_schema
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]
4. 扩展
4.1. 相关系统表
通过下列系统表可以查看数据库外部表信息。
| 系统表 | 简命令操作 | 含义 |
| pg_extension | \dx | 插件 |
| pg_foreign_data_wrapper | \dew | 支持外部数据库接口 |
| pg_foreign_server | \des | 外部服务器 |
| pg_user_mappings | \deu | 用户管理 |
| pg_foreign_table | \det | 外部表 |
4.2. 使用优化
减少对远端服务器的连接影响;可以使用物化视图。
1、在本地数据库创建物化视图
create materialized view mv_t1 as select * from t1;
2、 刷新一下本地的物化视图即可看到新进来的数据:
refresh materialized view mv_t1
4.3. 数据同步
本地创建外部表;可对外部表支持执行delete、update、insert语句;同时远程数据库的表也会执行相对应的操作。例如两个数据库实现token的一致。