基于Foreign Table的数据处理
- 将数据从一个数据库实例导入到另外一个数据库实例中。
- 多个数据库实例之间的关联查询。
- 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表或列存表、哈希表或者复制表。
- 如果关联的表在另外一个数据库实例是复制表或者存在数据倾斜,性能可能会很差。
- 使用期间,两个数据库实例的状态应为Normal。
- 两个数据库实例都需要具备基于Foreign Table的SQL on other openGauss数据处理功能。
- 建议配置LVS,如未配置,推荐使用多个DN作为server的地址,禁止将多个数据库实例的DN地址写在一起。
- 请尽可能保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。
- 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。
需要保证两个数据库实例可以连通,连接配置步骤如下:
设置远端数据库实例的侦听IP。
在需要接受远程服务的所有DN上(假设其中一个DN主机名为Linux-235,IP为10.11.12.16),将其对外提供服务的网卡IP或主机名(英文逗号分隔)添加到侦听列表中去(一般为本机IP,如果列表中已有则可以不用设置)。例如:
更详细的说明请参考、6。
在远端数据库实例DN设置认证方式。
假定本地openGauss数据库实例的各节点IP地址为:10.11.12.13,10.11.12.14,10.11.12.15,如设置sha256连接认证方式,则可在远端openGauss数据库实例上每一个有DN的节点执行如下命令:
gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.14/32 sha256"
gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.15/32 sha256"
对于本地openGauss数据库实例有很多节点,且其IP连续、在一个网段时,可进行批量设置,如:
# 允许IP为10.11.12.x的任何主机进行连接访问
gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.0/24 sha256"
# 允许IP为10.11.x.x的任何主机进行连接访问
gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.0.0/16 sha256"
对于本地openGauss数据库实例有很多节点,且其IP不连续或不在同网段时,用户可用脚本批量设置,具体请参考基于EC的数据处理的。
-
openGauss=# CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS
(address '10.146.187.231:8000,10.180.157.130:8000' ,
dbname 'test',
username 'test',
);
创建外表。
openGauss=# CREATE FOREIGN TABLE region
(
R_REGIONKEY INT4,
R_NAME TEXT,
R_COMMENT TEXT
)
SERVER
server_remote
OPTIONS
schema_name 'test',
table_name 'region',
encoding 'gbk'
使用外表进行导入数据或者关联查询。
导入数据。
openGauss=# CREATE TABLE local_region
(
R_REGIONKEY INT4,
R_NAME TEXT,
R_COMMENT TEXT
);
关联查询。
openGauss=# SELECT local_region * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME;