数据仓库服务 GAUSSDB(DWS)-基于GDS的跨集群互联互通:操作步骤

时间:2024-11-05 19:20:00

操作步骤

假设远端集群的待同步表名称是tbl_remote,用于数据同步的用户是user_remote,该用户须对表tbl_remote有访问权限;假设本地集群的待同步表名称是tbl_local。

  1. 创建server。

    CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS(
      address '192.168.178.207:8000',
      dbname 'db_remote',
      username 'user_remote',
      password 'xxxxxxxx',
      syncsrv 'gsfs://192.168.178.129:5000|gsfs://192.168.178.129:5000'
    );
    • server_remote为server名称,供互联互通外表使用。
    • address为远端集群CN的IP地址和端口,仅允许填写一个地址。
    • dbname为远端集群的数据库名。
    • username为连接远端集群使用的用户名,注意该用户不能为系统管理员。
    • password为连接远端集群使用的用户名的密码。
    • syncsrv为GDS Server的IP地址和端口,如果有多个地址使用|分割,与GDS外表的location类似。

      GaussDB (DWS)会对syncsrv所设置的GDS地址进行网络连接测试:

      • 只能判断本地执行集群与GDS的网络情况,无法判断远端集群与GDS的网络情况,需要注意报错提示。
      • 在移除不可用GDS后,从中选择不会导致业务hang的、数目适当的GDS进行数据同步。

  2. 创建互联互通外表。

    CREATE FOREIGN TABLE ft_tbl(
      col_1    type_name,
      col_2    type_name,
      …
    ) SERVER server_remote OPTIONS (
      schema_name 'schema_remote',
      table_name 'tbl_remote',
      encoding 'utf8'
    );
    • schema_name为远端集群表所属schema,如果该option缺省,则schema_name预设为该外表所在的schema。
    • table_name为远端集群表名,如果该option缺省,则table_name预设为该外表的表名。
    • encoding为远端集群的编码,如果该option缺省,则编码使用本地集群数据库的默认编码。
    • 选项schema_name、table_name大小写敏感,必须与远端schema、table的名字大小写保持一致。
    • 互联互通外表的列不允许带任何约束。
    • 互联互通外表的列名、列类型必须与远端集群的表tbl_remote的列名和列类型完全一致。
    • SERVER须设置为步骤1中新建的server,必须包含syncsrv属性。

  3. 使用互联互通外表进行数据同步。

    • 本地集群是目标集群时,发起数据同步业务:

      全列全量数据同步:

      1
      INSERT INTO tbl_local SELECT * FROM ft_tbl;
      

      全列过滤条件数据同步:

      1
      INSERT INTO tbl_local SELECT * FROM ft_tbl WHERE col_2 = XX;
      

      部分列全量数据同步:

      1
      INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl;
      

      部分列过滤条件数据同步:

      1
      INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl WHERE col_2 = XX;
      
    • 本地集群是源集群时,发起数据同步业务:

      单表数据同步:

      1
      INSERT INTO ft_tbl SELECT * FROM tbl_local;
      

      join结果集数据同步:

      1
      INSERT INTO ft_tbl SELECT * FROM tbl_local1 join tbl_local2 ON XXX;
      
    • 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。
    • 如遇到报错GDS连接失败,请检查syncsrv指定的GDS Server是否都已经启动,且与两个集群所有节点可以网络连通。
    • 如遇到报错表不存在,请检查外表的option信息是否正确。
    • 如遇到报错列不存在,请检查外表的列名是否与源表一致。
    • 如遇到报错列重复定义,请检查是否相应列名超长,若超长建议使用AS别名精简。
    • 如遇到报错无法解析列类型,请检查语句中是否有列上表达式。
    • 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。
    • 如遇到报错语法不支持,请检查是否使用了Join、distinct、排序等复杂用法。
    • 如遇到乱码,请检查两端数据库的实际编码是否一致。
    • 当本地集群是源集群时,存在极小的概率出现数据成功同步到远端集群,但是本地集群返回执行失败的情况,针对这种情况建议校验同步数据记录数。
    • 当本地集群是源集群时,通过事务块、子事务等控制的数据同步,需要总事务提交后才能查询到数据同步结果。

  4. 删除互联互通外表。

    DROP FOREIGN TABLE ft_tbl;

support.huaweicloud.com/migration-dws/dws_15_0041.html