数据复制服务 DRS-将MySQL同步到GaussDB(DWS):注意事项

时间:2024-06-24 11:40:39

注意事项

为保证任务的正常运行,DRS提供了自动化的检查方法,在您启动DRS任务前,会针对源数据库和目标数据库的相关配置、条件进行检查。主要的检查项和对应的处理建议请参考预检查项。除了预检查项目之外,您还需要注意的事情参见表4

表4 注意事项

类型名称

使用和操作限制

源数据库限制

  • 不支持reset master或reset master to命令,可能会导致DRS任务失败或者数据不一致。
  • 如果源数据库MySQL不支持TLS1.2协议,或者为版本较低的自建库(低于5.6.46或在5.7.0-5.7.28之间),需提交运维申请才能使用SSL测试连接。

使用限制

通用:

  • 实时同步过程中,若源库为RDS时,支持修改端口,修改之后同步任务失败,需要通过重试后继续进行同步。
  • 实时同步过程中,若源库为非RDS时,不支持修改端口。
  • 实时同步过程中,不支持IP、账号、密码修改。
  • 不允许源数据库进行恢复操作。
  • 不支持强制清理Binlog。

全量同步阶段:

  • 任务启动和全量数据同步阶段,请不要在源数据库执行DDL操作,否则可能导致任务异常。

增量同步阶段:

  • 如果设置session变量character_set_client为binary,可能导致乱码。
  • 增量同步过程中,不支持delete和update目标端主键类型为binary,text,blob,clob的表。
  • 库级同步新建的无主键表必须包含以下列中的其中之一,详细说明可参考 GaussDB (DWS)参数说明。

    INTEGER TYPES: TINYINT、SMALLINT、INT、BIGINT、NUMERIC/DECIMAL;

    CHARACTER TYPES: CHAR、BPCHAR、VARCHAR、VARCHAR2、NVARCHAR2;

    DATE/TIME TYPES: DATE、TIME、TIMETZ、TIMESTAMP、TIMESTAMPTZ、INTERVAL、SMALLDATETIME;

    无主键表会指定可作为分布列的其中一列作为分布列,如果所有列类型都无法作为分布列,会导致建表失败,DRS同步中断。

  • 增量同步过程中,不支持指定位置加列的DDL操作(例如ALTER TABLE ddl_test ADD COLUMN c2 AFTER/FIRST c1;),DRS会删除AFTER/FIRST属性,可能会导致列顺序不一致。
  • 增量同步过程中,执行不幂等的DDL可能导致数据不一致(例如ALTER TABLE ddl_test ADD COLUMN c3 timestamp default now();),DRS会因数据库函数执行结果不幂等导致最终数据不一致。
  • 增量同步过程中,库级同步不支持Online DDL,表级同步目前只支持阿里云DMS产生的Online DDL。
  • 增量同步过程中支持DDL操作。
    • 一对一的场景下,默认同步的DDL类型有CREATE_TABLE,RENAME_TABLE,ADD_COLUMN,MODIFY_COLUMN,ALTER_COLUMN,DROP_CONSTRAINT、ADD_CONSTRAINT、CREATE_INDEX,DROP_INDEX,RENAME_INDEX,RENAME_COLUMN,客户可以根据自身需求,在对象选择页面选择需要同步的DDL类型。
    • 多对一场景下,执行colunm重命名操作,必须停业务操作,不然会有数据不一致的风险。
    • 多对一场景下,推荐只同步加列DDL,其他的DDL同步可能会因为目标表被修改而导致任务失败或数据不一致。
    • 多对一场景下,执行ADD_COLUNM时,需保证每张表加列的类型一致,否则有可能导致任务失败。
    • 新增和修改表名、列名、索引名时不能超出63字符,否则任务会失败。
    • 执行DDL语句创建索引时,语句中表名+索引名超出63字符可能出现重名情况,造成索引创建失败。
    • 源库无主键表增加主键的时候,必须含有第一列,否则任务会失败。
    • 增量阶段执行DDL操作时,如果目标表不存在,则该DDL会被忽略掉。
    • 增量阶段,源数据库执行CHANGE COLUMN修改列信息,如果该列在目标数据库GaussDB(DWS)中为分布列,则该语句会被忽略,因为GaussDB(DWS)不支持修改分布列。
    • 增量阶段,由于源和目标数据库索引规则不一样,所以不支持RENAME INDEX的DDL操作。
    • 增量阶段,不建议CHAR(0)与其他字符拼接进行同步,例如插入CONCAT('a',CHAR(0),'b'),可能造成数据不一致。
    • 增量阶段,JSON数据类型里不建议CHAR(34)(双引号)、CHAR(92)(反斜杠)与其他字符拼接进行同步,例如插入JSON_OBJECT('$.0', CONCAT('a', CHAR(34), 'b')),同步到目标端后会多出一个反斜杠,造成数据不一致。

结束任务:

  • 任务正常结束

    请确保任务结束前,不要断开源和目标数据库的网络连通性,并在结束任务时关注同步日志上报的状态,达到数据库完整同步效果。

  • 任务强制结束

    强制结束将直接释放DRS资源。

常见故障排查:

  • 在任务创建、启动、全量同步、增量同步、结束等过程中,如有遇到问题,可先参考“故障排查”章节进行排查。

其他限制

  • 如果专属计算集群不支持4vCPU/8G或以上规格实例,则无法创建同步任务。
  • 相互关联的数据对象要确保同时同步,避免因关联对象缺失,导致同步失败。常见的关联关系:索引引用表等。
  • 不支持源数据库进行恢复操作。
  • 不支持强制清理binlog,否则会导致同步任务失败。
  • 同步无主键表时,如果存在唯一键,可能因数据冲突导致写入失败。
  • 不建议在数据库中使用非精确数值类型做主键,该特性影响DRS增量场景下对UPDATE、DELETE语句的同步,导致任务失败。
  • 如果无主键表中包含大字段(blob、text、clob、nclob、bytea),增量同步阶段存在大字段数据不一致的可能性。
  • 源库为RDS for MySQ L实例 时,不支持带有TDE特性并建立具有加密功能表。
  • 源库为RDS for MySQL实例时,支持源数据库多张表对GaussDB(DWS)一张表的映射。详细操作可参考创建MySQL到GaussDB(DWS)同步任务
  • 在创建DRS任务之前,如果源数据库实例开启并设置了SQL限流规则,可能会导致DRS任务失败。
  • MySQL 5.7版会过滤check约束,如果源数据库为5.7版时,不建议使用check约束,可能会导致数据不一致。
  • 网络中断在30秒内恢复的,不影响实时同步,如果超过30秒,则会导致同步任务失败。
  • MySQL的唯一约束(unique key)在同步到目标数据库GaussDB(DWS)后会改写成普通约束,主键(primary key)的同步保持不变。
  • 支持目标数据库中的表比源数据库多列场景,但是需要避免以下场景可能导致的任务失败。
    • 目标数据库多的列要求非空且没有默认值,源数据库insert数据,同步到目标数据库后多的列为null,不符合目标数据库要求。
    • 目标数据库多的列设置固定默认值,且有唯一约束。源数据库insert多条数据后,同步到目标数据库后多的列为固定默认值,不符合目标数据库要求。
  • 在MySQL中,同一个database(schema)下面的不同表可以存在相同的索引名或约束名。而目标端GaussDB(DWS)中,同一个schema中索引和约束名是唯一的,且长度存在上限。为防止索引和约束名冲突,DRS同步到目标表上的索引名称将变为此格式:哈希值+原索引名(可能被截断)+_key。其中哈希值由“原库名_原表名_原索引名”计算得到。同理,表上的原约束名将变为:哈希值+原约束名(可能被截断)+_key,或表名_原索引名。
  • 全量阶段基于索引实现上差异,只保留普通B-Tree索引,其他索引默认不同步。GaussDB(DWS)索引过多时会影响存储空间和入库性能,建议用户可根据业务需求按需建索引。
  • DRS全量同步表结构时,源库中char、varchar、nvarchar、enum、set字符类型长度在目标库会按照字节长自动扩大(因为目标库为字节长)。
  • 全量同步分区表的结构时会将该对象转为非分区的普通表,增量同步时,源库跟分区表相关的操作,可能无法同步到目标库或者在目标库执行失败。增量阶段同步分区表会依赖GaussDB(DWS)支持的类型创建分区表,可能会创建失败。
  • 全量同步timestamp类型时,默认值中的on update current_timestamp语法将不会同步到目标库GaussDB(DWS)中。
  • 已选择的表与未选择的表之间互相rename的DDL操作,在任务同步中会被过滤掉,可能会导致任务失败或数据不一致。
    • 对于一个DDL中存在一个rename的情况(例如:rename A TO B),只支持rename前后库表都在已选择库表中的rename操作(A和B都在已选择库表中),其他情况的rename DDL会被过滤。
    • 对于一个DDL中存在多个rename的情况(例如:rename A TO B, B TO C),只支持rename前后库表都在已选择库表中的部分rename操作 ,其他情况的rename DDL会被过滤(A和B在已选择库表中,C不在,仅执行rename A TO B)。
    • 不建议在多对一同步场景下的进行rename操作,可能会导致任务失败或数据不一致。
  • 增量同步DDL中的SQL来源于用户执行的原生SQL,全量同步的表结构语法是经过SQL语法层处理之后的SQL语句,两者之前存在一些类型或者约束差异,可能会导致全量和增量创建的结构或者字段类型不同,详细说明可参考同步到GaussDB(DWS)的使用建议
  • 源数据库同步的表如果有AUTO_INCREMENT属性,结束任务时,DRS会自动刷新同步表的序列整型列所对应的GaussDB自增列(sequence)起始值,刷新值为该列的最大值+10000。
support.huaweicloud.com/realtimesyn-drs/drs_04_0105.html