基于Foreign Table的数据处理

    • 将数据从一个数据库实例导入到另外一个数据库实例中。
    • 多个数据库实例之间的关联查询。
    • 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表或列存表、哈希表或者复制表。
    • 如果关联的表在另外一个数据库实例是复制表或者存在数据倾斜,性能可能会很差。
    • 使用期间,两个数据库实例的状态应为Normal。
    • 两个数据库实例都需要具备基于Foreign Table的SQL on other openGauss数据处理功能。
    • 建议配置LVS,如未配置,推荐使用多个DN作为server的地址,禁止将多个数据库实例的DN地址写在一起。
    • 请尽可能保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。
    • 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。

    需要保证两个数据库实例可以连通,连接配置步骤如下:

    1. 设置远端数据库实例的侦听IP。

      在需要接受远程服务的所有DN上(假设其中一个DN主机名为Linux-235,IP为10.11.12.16),将其对外提供服务的网卡IP或主机名(英文逗号分隔)添加到侦听列表中去(一般为本机IP,如果列表中已有则可以不用设置)。例如:

      更详细的说明请参考、6

    2. 在远端数据库实例DN设置认证方式。

      假定本地openGauss数据库实例的各节点IP地址为:10.11.12.13,10.11.12.14,10.11.12.15,如设置sha256连接认证方式,则可在远端openGauss数据库实例上每一个有DN的节点执行如下命令:

      1. gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.14/32 sha256"
      2. gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.15/32 sha256"

      对于本地openGauss数据库实例有很多节点,且其IP连续、在一个网段时,可进行批量设置,如:

      1. # 允许IP为10.11.12.x的任何主机进行连接访问
      2. gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.12.0/24 sha256"
      3. # 允许IP为10.11.x.x的任何主机进行连接访问
      4. gs_guc reload -Z datanode -N all -I all -h "host all all 10.11.0.0/16 sha256"

      对于本地openGauss数据库实例有很多节点,且其IP不连续或不在同网段时,用户可用脚本批量设置,具体请参考基于EC的数据处理的。

      1. openGauss=# CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS
      2. (address '10.146.187.231:8000,10.180.157.130:8000' ,
      3. dbname 'test',
      4. username 'test',
      5. );
    1. 创建外表。

      1. openGauss=# CREATE FOREIGN TABLE region
      2. (
      3. R_REGIONKEY INT4,
      4. R_NAME TEXT,
      5. R_COMMENT TEXT
      6. )
      7. SERVER
      8. server_remote
      9. OPTIONS
      10. schema_name 'test',
      11. table_name 'region',
      12. encoding 'gbk'
    2. 使用外表进行导入数据或者关联查询。

      • 导入数据。

        1. openGauss=# CREATE TABLE local_region
        2. (
        3. R_REGIONKEY INT4,
        4. R_NAME TEXT,
        5. R_COMMENT TEXT
        6. );
      • 关联查询。

        1. openGauss=# SELECT local_region * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME;