更新时间:2022-07-29 GMT+08:00

从GaussDB(DWS)集群导入数据到新集群

功能描述

通过在集群中创建Foreign Table的方式,实现在多个集群之间的关联查询和用来导入数据。

使用场景

  • 将数据从一个GaussDB(DWS)集群导入到另外一个GaussDB(DWS)集群中。
  • 多个集群之间的关联查询。

注意事项

  • 两个集群必须在同一个Region、一个AZ内且VPC网络互通。
  • 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表、列存表、哈希表或者复制表。
  • 如果关联的表在另外一个集群是复制表或者存在数据倾斜,性能可能会很差。
  • 使用期间,两个集群的状态应为“Normal”。
  • 使用期间,禁止对远端集群的源数据表做ddl修改和增、删、改操作,否则可能导致查询结果不一致。
  • 两个集群都需要具备基于Foreign Table的SQL on other GaussDB数据处理功能。
  • 建议配置LVS,如未配置,推荐使用多个CN作为server的地址,禁止将多个集群的CN地址写在一起。
  • 请尽可能保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。
  • 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。
  • 仅支持8.0.0及以上版本。

操作步骤

  1. 创建server。

    CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS 
       (address '10.180.157.231:8000,10.180.157.130:8000' ,
      dbname 'gaussdb', 
      username 'xyz', 
      password 'xxxxxx'
    );
    • server_remote为server名字,供外表使用。
    • address为远端集群CN的地址和端口号,如配置LVS,推荐只填写一个LVS地址,如未配置,推荐使用多个CN作为server的地址。
    • dbname为远端集群的数据库名。
    • username为连接远端集群使用的用户名,注意该用户不能为系统管理员。
    • password为连接远端集群使用的用户名的密码。

  2. 创建外表。

     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'
    );
    • 外表的列不允许带任何约束。
    • 外表的列名和列的类型要与远端集群对应的表的列名和列的类型完全一致。
    • schema_name为远端集群对应的表所在的schema,如果该option省略,则schema_name预设该外表所在的schema。
    • table_name为远端集群对应的表所在的表名,如果该option省略,则table_name预设该外表的表名。
    • encoding为远端集群的编码,如果该option省略,则编码使用远端集群数据库的默认编码。

  3. 查看建立的外表。

    \d+ region
    
                                  Foreign table "public.region"
       Column    |  Type   | Modifiers | FDW Options | Storage  | Stats target | Description
    -------------+---------+-----------+-------------+----------+--------------+-------------
     r_regionkey | integer |           |             | plain    |              |
     r_name      | text    |           |             | extended |              |
     r_comment   | text    |           |             | extended |              |
    Server: server_remote
    FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk')
    FDW permition: read only
    Has OIDs: no
    Distribute By: ROUND ROBIN
    Location Nodes: ALL DATANODES

  4. 查看建立的server。

    \des+ server_remote
                                                                                                                                   List of foreign servers
         Name      |  Owner  | Foreign-data wrapper | Access privileges | Type | Version |
                      FDW Options                                                                                    | Description
    ---------------+---------+----------------------+-------------------+------+---------+-----------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------+-------------
     server_remote | dbadmin | gc_fdw               |                   |      |         | (address '10.180.157.231:8000,10.180.157.130:8000', dbname 'gaussdb'
    , username 'xyz', password 'xxxxxx') |
    (1 row)

  5. 使用外表进行导入数据或者关联查询。

    • 导入数据。
       CREATE TABLE local_region
      (
          R_REGIONKEY INT4,
          R_NAME TEXT,
          R_COMMENT TEXT
      );
      INSERT INTO local_region SELECT * FROM region;
      • 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。
      • 如遇到报错表不存在,请检查外表的option信息是否正确。
      • 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。
      • 如遇到报错版本不一致,请升级低版本的集群在继续使用。
      • 如遇到乱码,请检查数据源的实际编码方式,并重新创建外表指定正确的编码。
    • 关联查询。
      SELECT * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME;
      • 外表可以当做一个本地表来使用,执行复杂的作业。
      • 如果远端集群已经有统计信息,请对该外表执行analyze以获得更优的执行计划。
      • 如果本地集群的DN数量比远端集群的DN数量少,本地集群需要使用SMP来获得更佳的性能。

  6. 删除外表。

    DROP FOREIGN TABLE region;