文档首页/ 数据复制服务 DRS/ 实时同步/ 任务管理/ 数据对比(对比同步项)
更新时间:2024-09-26 GMT+08:00

数据对比(对比同步项)

对比使用场景

对比实时同步项可以清晰反馈出源数据库和目标数据库的数据是否存在差异。为了尽可能减少业务的影响和业务中断时间,实时同步场景提供了以下几种对比方式:

  • 对象级对比:支持对数据库、索引、表、视图、存储过程和函数、表的排序规则等对象进行对比。
  • 数据级对比分为行对比和内容对比。
    • 行对比:对比同步的表的行数是否一致,只查询表的行数,对比速度较快,建议优先使用。
    • 内容对比:对比同步的表内数据是否一致,需要查询每条数据进行对比,相较于行对比,内容对比较慢。
    • 抽样对比:当数据量过大时,行数对比和内容对比需要较长时间,推荐使用抽样对比,设置适当的抽样比例可以在较短时间内获取到对比结果。
  • 用户对比:对源库和目标库的账号名称、权限进行对比。
  • 周期性对比:定时对源数据库与目标数据库表的行数进行对比并展示结果,需要用户开启并设置对比策略

在使用对比功能查看数据一致性时,建议优先使用行数对比,确定行数是否一致。如果出现行数不一致的情况,可以针对不一致的表,使用内容对比,来确定具体有哪些数据不一致。

表1 支持的对比方式

同步方向

数据流向

对象级对比

行对比

内容对比

动态内容对比

用户对比

入云

MySQL->MySQL

支持

支持

支持

支持

不支持

入云

MySQL->PostgreSQL

支持

支持

不支持

不支持

不支持

入云

MySQL->GaussDB分布式版

支持

支持

支持

支持

不支持

入云

MySQL->GaussDB主备版

支持

支持

支持

支持

不支持

入云

MySQL->GaussDB(for MySQL)

支持

支持

支持

支持

不支持

入云

MySQL->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

入云

MySQL->MariaDB

支持

支持

不支持

不支持

不支持

入云

PostgreSQL->PostgreSQL

支持

支持

支持

支持

支持

入云

PostgreSQL->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

入云

PostgreSQL->GaussDB 主备版

支持

支持

不支持

不支持

不支持

入云

PostgreSQL->GaussDB分布式版

支持

支持

不支持

不支持

不支持

入云

DDM->MySQL

支持

支持

不支持

不支持

不支持

入云

DDM->GaussDB(DWS)

不支持

支持

不支持

不支持

不支持

入云

DDM->DDM

支持

支持

不支持

不支持

不支持

入云

Oracle->MySQL

支持

支持

支持

支持

不支持

入云

Oracle->GaussDB(for MySQL)

支持

支持

支持

支持

不支持

入云

Oracle->GaussDB主备版

支持

支持

支持

支持

不支持

入云

Oracle->GaussDB分布式版

支持

支持

支持

支持

不支持

入云

Oracle->DDM

支持

支持

不支持

不支持

不支持

入云

Oracle->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

入云

Oracle->PostgreSQL

支持

支持

不支持

不支持

不支持

入云

DB2 for LUW->GaussDB主备版

支持

支持

不支持

不支持

不支持

入云

DB2 for LUW->GaussDB分布式版

支持

支持

不支持

不支持

不支持

入云

DB2 for LUW->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

入云

TiDB->GaussDB(for MySQL)

支持

支持

不支持

不支持

不支持

入云

Microsoft SQL Server->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

入云

Microsoft SQL Server->GaussDB主备版

支持

支持

支持

不支持

不支持

入云

Microsoft SQL Server->GaussDB分布式版

支持

支持

支持

不支持

不支持

入云

Microsoft SQL Server->Microsoft SQL Server

支持

支持

不支持

不支持

不支持

入云

Microsoft SQL Server->MySQL

支持

支持

不支持

不支持

不支持

入云

Microsoft SQL Server->GaussDB(for MySQL)

支持

支持

不支持

不支持

不支持

入云

Microsoft SQL Server->PostgreSQL

支持

支持

不支持

不支持

不支持

入云

MongoDB->DDS

支持

支持

不支持

不支持

不支持

入云

MariaDB->MariaDB

支持

支持

支持

支持

不支持

入云

MariaDB->MySQL

支持

支持

不支持

不支持

不支持

入云

MariaDB->GaussDB(for MySQL)

支持

支持

不支持

不支持

不支持

入云

GaussDB(for MySQL)->GaussDB(for MySQL)

支持

支持

支持

支持

不支持

入云

Cassandra->GeminiDB Cassandra

支持

不支持

不支持

不支持

不支持

入云

Dynamo->GeminiDB Dynamo

支持

不支持

支持

不支持

不支持

出云

MySQL->MySQL

支持

支持

支持

支持

不支持

出云

MySQL->kafka

不支持

不支持

不支持

不支持

不支持

出云

MySQL->CSS/ES

支持

支持

不支持

不支持

不支持

出云

MySQL->Oracle

支持

支持

不支持

不支持

不支持

出云

MySQL->MariaDB

支持

支持

不支持

不支持

不支持

出云

DDM->MySQL

支持

支持

不支持

不支持

不支持

出云

DDM->Oracle

支持

支持

不支持

不支持

不支持

出云

DDM->Kafka

不支持

不支持

不支持

不支持

不支持

出云

DDS->MongoDB

支持

支持

支持

不支持

不支持

出云

DDS->Kafka

不支持

不支持

不支持

不支持

不支持

出云

PostgreSQL->PostgreSQL

支持

支持

支持

支持

不支持

出云

PostgreSQL->Kafka

不支持

不支持

不支持

不支持

不支持

出云

GaussDB主备版->MySQL

支持

支持

不支持

不支持

不支持

出云

GaussDB主备版->Oracle

支持

支持

不支持

不支持

不支持

出云

GaussDB主备版->Kafka

不支持

不支持

不支持

不支持

不支持

出云

GaussDB主备版->GaussDB(DWS)

支持

支持

支持

不支持

不支持

出云

GaussDB主备版->GaussDB分布式版

支持

支持

不支持

不支持

不支持

出云

GaussDB主备版->GaussDB主备版

支持

支持

不支持

不支持

不支持

出云

GaussDB分布式版->MySQL

支持

支持

不支持

不支持

不支持

出云

GaussDB分布式版->Oracle

支持

支持

不支持

不支持

不支持

出云

GaussDB分布式版->GaussDB(DWS)

支持

支持

支持

不支持

不支持

出云

GaussDB分布式版->Kafka

不支持

不支持

不支持

不支持

不支持

出云

GaussDB分布式版->GaussDB分布式版

支持

支持

不支持

不支持

不支持

出云

GaussDB分布式版->GaussDB主备版

支持

支持

不支持

不支持

不支持

出云

GaussDB(for MySQL)->MySQL

支持

支持

支持

支持

不支持

出云

GaussDB(for MySQL)->GaussDB(DWS)

支持

支持

不支持

不支持

不支持

出云

GaussDB(for MySQL)->Kafka

不支持

不支持

不支持

不支持

不支持

出云

GaussDB(for MySQL)->CSS/ES

支持

支持

不支持

不支持

不支持

出云

GaussDB(for MySQL)->Oracle

支持

支持

不支持

不支持

不支持

出云

MariaDB->MariaDB

支持

支持

支持

支持

不支持

出云

Microsoft SQL Server->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

Oracle->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

Oracle->GaussDB主备版

支持

支持

支持

支持

不支持

自建-自建

Oracle->GaussDB分布式版

支持

支持

支持

支持

不支持

自建-自建

MySQL->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

MySQL->CSS/ES

支持

支持

不支持

不支持

不支持

自建-自建

MySQL->GaussDB主备版

支持

支持

不支持

不支持

不支持

自建-自建

MySQL->GaussDB分布式版

支持

支持

不支持

不支持

不支持

自建-自建

PostgreSQL->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

GaussDB主备版->MySQL

支持

支持

不支持

不支持

不支持

自建-自建

GaussDB主备版->Oracle

支持

支持

不支持

不支持

不支持

自建-自建

GaussDB主备版->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

GaussDB主备版->GaussDB主备版

支持

支持

不支持

不支持

不支持

自建-自建

GaussDB分布式版->Oracle

支持

支持

不支持

不支持

不支持

自建-自建

GaussDB分布式版->Kafka

不支持

不支持

不支持

不支持

不支持

自建-自建

GaussDB分布式版->GaussDB布式版

支持

支持

不支持

不支持

不支持

自建-自建

DB2 for LUW->GaussDB主备版

支持

支持

不支持

不支持

不支持

自建-自建

DB2 for LUW->GaussDB分布式版

支持

支持

不支持

不支持

不支持

自建-自建

Microsoft SQL Server->Kafka

不支持

不支持

不支持

不支持

不支持

约束限制

  • 对比需要在任务处于增量阶段才能手动创建。
  • 对比是大小写敏感的,如果源数据库或目标数据库一端为非大小写敏感,一端为大小写敏感,对比结果可能出现不一致的情况。
  • 对于单全量,在任务结束的时候,DRS会自动创建对象对比和行对比。对比时如果源库有数据操作,可能会导致对比结果不一致。
  • 如果在对比时源库进行DDL操作,为保证对比结果的准确性,需重新进行内容对比。
  • 如果单独对目标库进行数据修改操作,可能会导致对比结果不一致。
  • 如果源数据库字符类型存在编码异常的情况,通过DRS迁移或对比时会因数据库驱动转码转换为异常码点,最终可能导致内容对比一致,实际字节不一致。
  • 内容对比功能目前只支持带有主键的表,对于不支持内容对比的表可以使用行数对比功能。所以数据级对比功能需要结合业务场景,选用行数对比或者内容对比。
  • DRS进行内容比对期间不能暂停DRS任务,否则可能导致比对任务失败。
  • 部分数据类型不支持内容对比,详情参考内容对比不支持哪些数据类型
  • 为避免占用资源,DRS限制对比任务的时长,超过限制时长,对比任务自动停止。
    • 对于单全量任务结束时自动创建的对比任务,超时限制时长30分钟,超过后行对比和对象对比任务自动停止,DRS单全量任务结束。
    • 对于增量阶段用户手动创建的行对比任务,当源库是关系型数据库时,行对比限制时长为60分钟;源库为非关系数据库,比如MongoDB,行对比限制时长为30分钟。
  • 为避免占用资源,DRS任务的对比结果限制保留60天,60天后自动清除。
  • MySQL为源链路,源数据库中的虚拟列不支持内容对比,对比时会过滤虚拟列。
  • 对于支持内容对比、抽样对比的同步链路,如果创建任务时可以选择实例规格,那么仅支持大规格及以上规格进行内容对比、抽样对比。
  • 行对比的多对一场景,是将源库中的表与映射到目标库中的聚合表中对应的那部分数据做行数比对。
  • 对于多对一同步任务场景,不建议使用内容对比,因为内容对比无法保证一致性。
  • 不支持一个库中的表映射到多个库的任务进行内容对比。
  • MySQL、GaussDB(for MySQL)、MariaDB为源链路,源数据库中的虚拟列不支持内容对比,对比时会过滤虚拟列。
  • PostgreSQL为源的链路,在表映射场景下,索引和约束名称也会被修改,导致索引和约束的对比不一致。
  • MySQL为源的链路,如果源数据库的表中存在定长的binary字段,MySQL驱动会在数据末尾按照长度补齐\0,可能导致同步到目标库GaussDB后出现数据不一致的情况。
  • Oracle数据库中插入的空字符会被当成NULL来处理,因此对于Oracle为目标数据库的链路,DRS对比时会把空字符串和NULL做等价处理。源数据库是空字符串,目标数据库是NULL,对比结果显示一致。
  • Oracle->GaussDB分布式内容比对,因为GaussDB分布式的BLOB用DBE_LOB.LOB_GET_LENGTH查询失败,当LOB比对策略选择比对LOB长度时,比对会忽略BLOB比对。
  • Dynamo->GeminiDB Dynamo内容比对进行数据过滤时,过滤条件不支持二进制类型。内容比对以源为准,无法识别目标比源多记录的情况。

对数据库影响

  • 对象对比:会查询源库及目标库的系统表,占用10个左右的session的连接数,正常情况不会对数据库产生影响。但是如果对象数量巨大(比如几十万张表),可能会对数据库产生一定的查询压力。
  • 行数对比:会查询源库及目标库的表行数,占用10个左右的session的连接数,正常的select count语句基本不会对数据库产生影响。但是如果表数据量巨大(亿级)会对数据库产生一定的查询压力,返回查询结果会比较慢。
  • 内容对比:会查询源库及目标库的全部数据,涉及每个字段都会对比,所以会对数据库产生一定的查询压力,主要体现在IO上,查询速度受限于源库和目标库的IO和网络带宽。占用1-2个CPU,占用10个左右的session的连接数。
  • 用户对比:会查询源库及目标库的账户和权限,基本不会对数据库产生影响。

对比耗时预估

  • 对象对比:根据源库查询性能,一般会在几分钟内返回结果,如果对象数据量特别巨大,对比时长可能达到几十分钟。
  • 行数对比:使用select count方式,查询速度跟数据库性能相关。
  • 内容对比:在数据库没有压力并且网络正常的情况下,对比速度大概是5M/s。
  • 用户对比:与对象对比同时返回结果,如果对象不多的情况下,基本会在几分钟就会返回结果。

前提条件

  • 已登录数据复制服务控制台。
  • 已启动同步任务。

创建对比任务

  1. “实时同步管理”界面,选中指定同步任务,单击任务名称,进入“基本信息”页签。
  2. 单击“同步对比”页签,进入“同步对比”信息页面。
  3. 对比同步项。

    • 创建对象级对比:选择“对象级对比”页签,单击“开始对比”后稍等一段时间再单击,观察源数据库和目标数据库的各个对比项结果是否一致。若需要查看结果详情,可单击指定对比项操作列的“详情”按钮。
      图1 同步对象对比
    • 创建数据级对比(行数、内容对比):选择“数据级对比”页签,单击“创建对比任务”,选择“对比类型”、“对比方式”、“对比时间”和“对象选择”,单击“是”提交对比任务。
      图2 创建数据对比任务
      • 对比类型:分为行数对比和内容对比。
        • 行数对比:用于对比源和目标端的表的行数是否相等。
          • 任务进入增量阶段后,用户可以创建行对比任务。
          • Oracle->GaussDB同步任务,当全量任务结束的时候会自动触发行对比任务。
        • 内容对比:用于对比源和目标端的表的数据是否一致。
          • 任务进入增量阶段后,用户可以创建内容对比任务。全量同步完成后,源库数据不能发生变更,否则内容对比结果会不一致。
          • Oracle->GaussDB主备版、Oracle->GaussDB分布式进入增量校验状态后,对比服务会开始通过解析的该任务涉及的表的增量日志抽取数据,持续对比。如果用户想要对比其他表的同步状态,可以取消正在对比的任务,创建新的对比任务。

          由于内容对比功能目前只支持带有主键的表,不支持内容对比的表可以使用行数对比功能。所以数据级对比功能需要结合业务场景,选用行数对比或者内容对比。

      • 对比策略:分为普通对比和多对一对比两种。
        • 普通对比策略:源库中的一张表跟映射到目标库中的那张表做整表的行数比对。
        • 多对一对比策略:源库中的一张表跟映射到目标库中的聚合表中对应的那部分数据做行数比对。

          对比类型为行数对比时,支持对比策略选择。

      • 对比方式:分为静态对比和动态对比两种。
        • 静态对比:对源数据库和目标数据库进行一次全量内容对比,内容对比完成后对比任务结束,适用于无数据变化的非业务时间。
        • 动态对比:先对源数据库和目标数据库进行一次全量内容对比,对比任务完成后进入增量对比阶段,实时比对源数据库和目标数据库的增量数据,适用于有数据变化的业务时间。
          • 对比类型为内容对比时,支持对比方式的选择。
          • 选择库级同步时,动态对比过程中不支持在源库创建新表。如需创建,请先取消动态对比,待新表创建并同步完成后,再重新启动动态对比。
      • 对比时间:可设置为“立即启动”“稍后启动”。由于同步具有轻微的时差,在数据持续操作过程中进行对比任务,可能会出现符合实际情况的少量数据不一致对比结果,推荐结合对比定时功能,选择在业务低峰期进行对比,得到更为具有参考性的对比结果。
      • LOB对比策略:分为忽略LOB比对、比对长度、比对hash、和比对内容四种。

        目前仅支持Oracle->GaussDB设置LOB对比策略。

        • 忽略LOB比对:内容比对时忽略LOB字段。建议选择忽略LOB比对,LOB比对可能会对数据库产生一定的压力,压力大小取决于LOB比对方式和数据量的大小,请根据源和目标数据库情况进行评估和测试,以确保数据库的性能和稳定性。
        • 比对长度:内容比对时采用源端和目标端的内置函数获取LOB数据长度进行数据比对。
        • 比对hash:采用源端和目标端的内置函数获取LOB数据哈希值进行数据比对,Oracle使用DBMS_CRYPTO包中的HASH函数来获取LOB哈希值,使用DBMS_CRYPTO包需要SYSDBA对用户赋权,赋权语句参考:
          GRANT EXECUTE ON DBMS_CRYPTO TO USER;
        • 比对内容:源端采用流式读取数据后再做哈希,目标库采用内置函数获取LOB数据哈希值,这种方式相对hash比对会减轻一些源库压力,但运行时间会久一些。
      • 进行数据过滤:开启后,可根据配置的过滤条件进行对象比对。

        目前仅支持Oracle->GaussDB、GaussDB->Oracle、GaussDB->GaussDB、MySQL->MySQL、MySQL-GaussDB设置数据过滤对比。

        1. 选择开启数据过滤后,需要为选择对比的表对象添加过滤条件。
        2. 在过滤条件区域,填写过滤条件后,单击“校验规则”
          • 过滤表达式不支持使用某种数据库引擎特有的package、函数、变量、常量等写法,须使用通用SQL标准。
          • 请直接输入SQL语句中WHERE之后的部分(不包含WHERE和分号,例如:sid > 3 and sname like "G %")。
          • 过滤条件不支持使用隐式转换规则,请填写正确的数据类型条件。例如Oracle的c列是字符类型varchar2,过滤条件应该设置为 c > '10',而不是c > 10。
          • 不支持对LOB字段设置过滤条件,如CLOB、BLOB、BYTEA等大字段类型。
          • 建议不要对非精确类型字段设置过滤条件,如FLOAT、DECIMAL、DOUBLE等。
          • 建议不要对带有特殊字符的字段设置过滤条件。
          • 暂不支持对库名、shema名、表名大小写混用的对象进行过滤比对。
          • 暂不支持单库超过5万张表情况下进行条件过滤。
        3. 校验通过后,单击“生成加工规则”,即可在加工规则表格中看到该规则。
        4. 检查无误后,单击“确定”,创建对比任务。
      • 对象选择:可根据具体的业务场景选择需要进行对比的对象。
    • 创建数据级对比(抽样对比):当数据量过大时,行数对比和内容对比需要较长时间,推荐使用抽样对比,设置适当的抽样比例可以在较短时间内获取到对比结果。
      在“数据级对比”页签,单击“创建对比任务”,选择“抽样对比”,设置“抽样比例”、“对比时间”和“对象选择”后,单击“确定”提交对比任务。
      • 目前实时同步支持MongoDB->DDS、DDS->MongoDB、GaussDB分布式版->GaussDB分布式版子任务进行抽样对比。
      • 仅支持大规格及以上规格的任务进行抽样对比。
      • MongoDB抽样方法采用MongoDB提供的$sample命令进行数据抽样:{ $sample: { size: <positive integer N> } }。

        其中size为设置的固定值1000,DRS提供的MongoDB抽样对比实际为多次执行$sample命令,直到抽样的数据量达到用户指定的抽样比例。

      • 单次抽样对比任务会执行多次$sample命令,多次$sample命令可能会获取到源库相同的数据。
      • 集合的总数据量通过estimatedDocumentCount方法获取,为估算值而非精确值,实际的抽样数据量与抽样比例可能会有所浮动,属于正常现象。
      • 抽样对比不支持_id为BinData数据类型的Document,抽到_id为BinData数据类型的Document将会过滤不进行对比。
      • MongoDB单个抽样对比任务的不一致数据量若超过10000条数据,则不再继续对比,最多只能展示出10000条不一致数据。
      图3 抽样对比
    • 创建用户对比:单击“用户对比”页签,可查看数据库账号及权限的对比结果。
      • 全量同步中的任务无法进行用户对比。
      • 实时同步目前仅PostgreSQL->PostgreSQL的同步支持用户对比。

  4. 对比任务提交成功后,返回“数据级对比”页签,单击刷新列表,可以查看到所选对比类型的对比结果。

    图4 同步数据对比

    由于内容对比功能目前只支持带有主键的表,不支持内容对比的表可以使用行数对比功能。所以数据级对比功能需要结合业务场景,选用行数对比或者内容对比。

    若需要查看行数对比或者内容对比详情,可单击指定对比类型操作列的“查看对比报表”,页面将跳转至新的窗口,可观察对比结果的详细情况。

    若需要下载行数对比或者内容对比结果,可单击指定对比类型操作列的“导出报告”。

    图5 行数对比详情
    图6 内容对比详情
    • 运行中的任务可以随时取消,已取消的对比任务也支持查看对比报表。
    • 行对比结果可按照“源库表行数”或“目标库表行数”,对当前页面显示的结果进行升序或者降序排列,方便进行筛选。
    • 行对比差异显示为负数时,代表目标库表行数比源库表行数多;显示为正数时,代表源库表行数比目标库表行数多。

周期性对比

周期性对比是DRS定时对源数据库与目标数据库表的行数进行对比,并展示结果。

  1. “实时同步管理”界面,选中指定同步任务,单击任务名称,进入“基本信息”页签。
  2. 单击“同步对比”页签,进入“同步对比”信息页面。
  3. 选择“周期性对比”页签,单击“修改对比策略”

    目前仅支持MySQL->MySQL、MySQL->GaussDB(for MySQL)、MySQL->GaussDB(DWS)、GaussDB(for MySQL)->MySQL同步支持周期性对比设置。

  4. 在“修改对比策略”对话框中,开启周期性对比并设置对比频率、时间等策略,单击“是”完成设置。

    • 开启后,DRS会按照设置的定时策略进行行数对比,对比结果需要在数据级对比中查看。
    • 关闭周期性对比后,下一次的周期性对比将不会再进行,历史对比结果仍可正常查看。
    • 修改检查设置不会影响当前在进行的周期性对比任务,修改后的设置下次生效。
    • 周期性对比会在源和目标端执行一定的读取操作,请选择无业务期时间点进行对比。
    • 周期性对比自动剔除超大表(行数超过一亿行),该类大表建议采用数据级对比功能进行抽查,不建议作为周期性对比表。
    图7 修改对比策略