介绍
fdw(foreign data wrapper 外部数据包装器)可以实现磐维数据库及远程服务器之间的跨库操作。
本次介绍postgres_fdw,是一款开源插件,postgres_fdw默认参与编译,登录数据库后通过CREATE EXTENSION postgres_fdw;语句创建插件即可使用。
环境准备
首先自行搭建两套磐维数据库,本次搭建两套磐维2.0集群进行演示,如下:
两套集群互相放通白名单
su - omm gs_guc reload -N all -I all -h "host all all 192.168.129.0/24 sha256" |
详细步骤
1、创建用户:
gsql -r CREATE USER user_crw IDENTIFIED BY 'Crw@1234'; ALTER USER user_crw sysadmin; \du+ user_crw |
2、创建postgres_fdw扩展
(可对特定数据库创建扩展)
创建并连接至库: gsql -r DROP DATABASE database_crw; CREATE DATABASE database_crw ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C'; -- ALTER DATABASE database_crw OWNER TO user_crw; -- gsql -r -U user_crw -p 17700 -W Crw@1234 -h 192.168.129.41 -d database_crw; \c database_crw user_crw CREATE SCHEMA schema_crw; SET SEARCH_PATH TO schema_crw; ALTER ROLE user_crw SET search_path TO schema_crw; SHOW SEARCH_PATH; 创建扩展: CREATE EXTENSION postgres_fdw; --注意如果没设置SEARCH_PATH则默认是public; 查看扩展: \dx \dx+ postgres_fdw --如果未修改search_path,则为public,后续映射用户建议配置为public。 删除扩展: DROP EXTENSION postgres_fdw; |
3、定义一个新的外部服务器
语法如下: CREATE SERVER server_name FOREIGN DATA WRAPPER fdw_name OPTIONS ( { option_name ' value ' } [, ...] ) ; fdw_name:指定外部数据封装器的名称,如mysql_fdw,postgres_fdw... 示例: CREATE SERVER fedlink_to_21 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (hostaddr '192.168.129.21', port '17700', dbname 'database_crw'); 查看已创建的外部服务器: SELECT * FROM pg_foreign_server; 删除外部服务器: DROP SERVER IF EXISTS fedlink_to_21; |
4、定义一个用户到一个外部服务器的新映射
语法如下: CREATE USER MAPPING FOR { user_name | USER | CURRENT_USER | PUBLIC } SERVER server_name [ OPTIONS ( option 'value' [ , ... ] ) ] 示例: gs_ssh -c "gs_guc generate -S 其中-S参数指定default时会随机生成密码,用户也可为-S参数指定密码,此密码用于保证生成密码文件的安全性和唯一性,用户无需保存或记忆,-D指定密码保护文件生成路径。 在$GAUSSHOME/bin目录下自动生成如下2个文件: 登入磐维库并创建用户映射: gsql -r -U user_crw -p 17700 -W Crw@1234 -h 192.168.129.41 -d database_crw; CREATE USER MAPPING FOR user_crw SERVER fedlink_to_21 OPTIONS( user 'user_crw',password 'Crw@1234'); 查看用户映射: SELECT * FROM pg_user_mappings; 删除用户映射: DROP USER MAPPING IF EXISTS FOR user_crw SERVER fedlink_to_21; |
5、对端(目标端)创建外表对应的表
--建立外表时,不会同步在对端建表。
gsql -r -U user_crw -p 17700 -W Crw@1234 -h 192.168.129.21 -d database_crw; CREATE TABLE schema_crw.ftable21_ftable41 (id int, name varchar(20) NOT NULL); insert into schema_crw.ftable21_ftable41 values(1,'crw'); select * from schema_crw.ftable21_ftable41; |
6、创建外表
CREATE FOREIGN TABLE schema_crw.ftable41_ftable21 (id int, name varchar(20) NOT NULL) SERVER fedlink_to_21 OPTIONS(schema_name 'schema_crw', table_name 'ftable21_ftable41'); 查看外表结构: \d schema_crw.ftable41_ftable21 查看已创建的外表: SELECT * FROM pg_foreign_table; 删除外表: DROP FOREIGN TABLE schema_crw.ftable41_ftable21; |
7、能查询到外表数据
SELECT * FROM schema_crw.ftable41_ftable21;
至此就是postgres_fdw扩展的全部介绍。
注意事项
1.两个postgres_fdw外表间的SELECT JOIN不支持下推到远端openGauss执行,会被分成两条SQL语句传递到远端openGauss执行,然后在本地汇总处理结果。
2.不支持IMPORT FOREIGN SCHEMA语法。
3.不支持对外表进行CREATE TRIGGER操作。
参考链接
https://docs-opengauss.osinfra.cn/zh/docs/3.0.0/docs/Developerguide/postgres_fdw.html
https://119.8.102.148/zh/mogdb/v5.0/3-postgres_fdw




