
# 数据对比（对比迁移项）
对比迁移项可以清晰反馈出源数据库和目标数据库的数据是否存在差异。为了尽可能减少业务的影响和业务中断时间，数据库实时迁移场景提供了完整的迁移对比流程，帮助您确定合适的业务割接时机。
图1迁移对比流程   
![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001245509992.png "点击放大")
#### 对比使用场景
迁移对比功能支持以下几种对比方式：
- 对象级对比：支持对数据库、索引、表、视图、存储过程和函数、表的排序规则等对象进行对比，建议在全量迁移完成后进行对比。
- 数据级对比分为行对比和内容对比。
  - 行对比：对比迁移的表的行数是否一致，只查询表的行数，对比速度较快，建议优先使用。
  
  - 内容对比：对比迁移的表内数据是否一致，需要查询每条数据进行对比，相较于行对比，内容对比较慢。
  
  - 抽样对比：当数据量过大时，行数对比和内容对比需要较长时间，推荐使用抽样对比，设置适当的抽样比例可以在较短时间内获取到对比结果。
   
- 用户对比：对源库和目标库的账号名称、权限进行对比。
- 周期性对比：定时对源数据库与目标数据库表的行数或对象进行对比并展示结果，需要用户[开启并设置对比策略]。
在使用对比功能查看数据一致性时，建议优先使用行数对比，确定行数是否一致。如果出现行数不一致的情况，可以针对不一致的表，使用内容对比，来确定具体有哪些数据不一致。
表1支持的对比方式 
| **迁移方向** | **数据流向**                    | **对象级对比** | **行对比** | **内容对比** | 无主键表内容对比 | **动态内容对比** | **用户对比** | **抽样对比** |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| 入云       | MySQL-\>MySQL               | 支持        | 支持      | 支持       | 不支持      | 支持         | 支持       | 不支持      |
| 入云       | MySQL-\>TaurusDB            | 支持        | 支持      | 支持       | 不支持      | 支持         | 支持       | 不支持      |
| 入云       | MySQL-\>DDM                 | 支持        | 支持      | 不支持      | 不支持      | 不支持        | 不支持      | 不支持      |
| 入云       | MongoDB-\>DDS               | 支持        | 支持      | 支持       | 不支持      | 不支持        | 支持       | 支持       |
| 入云       | MongoDB-\>GeminiDB Mongo    | 支持        | 支持      | 支持       | 不支持      | 不支持        | 不支持      | 不支持      |
| 入云       | MySQL分库分表-\>DDM             | 支持        | 支持      | 不支持      | 不支持      | 不支持        | 不支持      | 不支持      |
| 入云       | Redis单机/主备-\>GeminiDB Redis | 支持        | 不支持     | 不支持      | 不支持      | 不支持        | 不支持      | 不支持      |
| 出云       | MySQL-\>MySQL               | 支持        | 支持      | 支持       | 不支持      | 支持         | 支持       | 不支持      |
| 出云       | DDS-\>MongoDB               | 支持        | 支持      | 支持       | 不支持      | 不支持        | 不支持      | 支持       |
| 出云       | GeminiDB Redis-\>Redis单机/主备 | 支持        | 不支持     | 不支持      | 不支持      | 不支持        | 不支持      | 不支持      |
   
#### 对比约束限制
- 对比需要在任务处于增量阶段才能手动创建，包括增量中，增量异常和增量暂停阶段。
- 对比是大小写敏感的，如果源数据库或目标数据库一端为非大小写敏感，一端为大小写敏感，对比结果可能出现不一致的情况。
- 对于单全量，在任务结束的时候，DRS会自动创建对象对比和行对比。对比时如果源库有数据操作，可能会导致对比结果不一致。
- 如果在对比时源库进行DDL操作，为保证对比结果的准确性，需重新进行内容对比。
- 如果单独对目标库进行数据修改操作，可能会导致对比结果不一致。
- 如果源数据库字符类型存在编码异常的情况，通过DRS迁移或对比时会因数据库驱动转码转换为异常码点，最终可能导致内容对比一致，实际字节不一致。
- 内容对比功能目前只部分支持无主键的表，对于不支持内容对比的表可以使用行数对比功能。所以数据级对比功能需要结合业务场景，选用行数对比或者内容对比。
- DRS生成的不一致数据查询SQL中，时间类型是基于UTC时间的，如果表中存在时间字段，查询不一致数据前需要先将会话时区设置为0时区。
- 无主键表内容对比仅支持静态内容对比，不支持动态内容对比。
- DRS进行内容比对期间不能暂停DRS任务，否则可能导致比对任务失败。
- 部分数据类型不支持内容对比，详情参考[内容对比不支持哪些数据类型](https://support.huaweicloud.com/drs_faq/drs_16_1130.html)。
- 为避免占用资源，DRS限制对比任务的时长，超过限制时长，对比任务自动停止。
  - 对于单全量任务结束时自动创建的对比任务，超时限制时长30分钟，超过后行对比和对象对比任务自动停止，DRS单全量任务结束。
  
  - 对于增量阶段用户手动创建的行对比任务，当源库是关系型数据库时，行对比限制时长为60分钟；源库为非关系数据库，比如MongoDB，行对比限制时长为30分钟。
   
- 为避免占用资源，DRS任务的对比结果限制保留60天，60天后自动清除。
- MySQL为源链路，源数据库中的虚拟列不支持内容对比，对比时会过滤虚拟列。
- 当目标数据库为5.7版本时，因为版本限制，json类型中的浮点数会丢失小数点后末位的0，存在精度损失导致内容对比不一致。
- 当内容对比过程中表出现表DDL变化时，可能会引起任务失败，此时需要用户重新进行对比，建议对比过程中尽量减少对表的DDL变更。
 
#### 对数据库影响
- 对象对比：会查询源库及目标库的系统表，占用10个左右的session的连接数，正常情况不会对数据库产生影响。但是如果对象数量巨大（比如几十万张表），可能会对数据库产生一定的查询压力。
- 行数对比：会查询源库及目标库的表行数，占用10个左右的session的连接数，正常的select count语句基本不会对数据库产生影响。但是如果表数据量巨大（亿级）会对数据库产生一定的查询压力，返回查询结果会比较慢。
- 内容对比：会查询源库及目标库的全部数据，涉及每个字段都会对比，所以会对数据库产生一定的查询压力，主要体现在IO上，查询速度受限于源库和目标库的IO和网络带宽。占用1-2个CPU，占用10个左右的session的连接数。
- 用户对比：会查询源库及目标库的账户和权限，基本不会对数据库产生影响。
 
#### 对比耗时预估
- 对象对比：根据源库查询性能，一般会在几分钟内返回结果，如果对象数据量特别巨大，对比时长可能达到几十分钟。
- 行数对比：使用select count方式，查询速度跟数据库性能相关。
- 内容对比：在数据库没有压力并且网络正常的情况下，对比速度大概是5MB/s。
- 用户对比：与对象对比同时返回结果，如果对象不多的情况下，基本会在几分钟就会返回结果。
 
#### 前提条件
- 已登录数据复制服务控制台。
- 已启动迁移任务。
 
#### 创建对比任务
在进行迁移项数据对比时，您可以按照迁移对比须知模块推荐的流程操作，也可以根据业务场景选用对比方式。以下操作将按照迁移对比须知模块的推荐方案详细介绍各功能的使用方法。
1. 在"实时迁移管理"界面，选中指定迁移任务，单击任务名称，进入"基本信息"页签。
2. 单击"迁移对比"页签，进入"迁移对比"信息页面，对源数据库和目标数据库的数据进行对比分析。 
   您也可以在"实时迁移管理"界面，选中指定迁移任务，单击操作列的"查看对比"，进入"迁移对比"页面。
   - 创建**对象级对比** ：通过对象对比，先对数据库对象完整性进行检查。
     单击"对象级对比"，进入"对象级对比"页签，单击"开始对比"后稍等一段时间再单击![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001950412924.png)，查看各个对比项的对比结果。
     图2对象级对比   
     ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001981612481.png "点击放大")
     如果需要查看对比项的对比结果详情，可单击指定对比项操作列的"详情"。
     
   
   - 创建**数据级对比** **（行数、内容对比）** ：数据库对象检查完成后，进行迁移数据行数及内容的对比。
     如果仅需要对比全部迁移对象的行数，您也可以在"实时迁移管理"界面，选中指定迁移任务，单击操作列的"创建对比"，创建对比任务。
     1. 单击迁移对比须知处的"全面检查"，进入"创建对比任务"页面。
     
     2. 在"创建对比任务"页面，分别选择"对比类型"、"对比方式"、"对比时间"和"对象选择"后，单击"是"，提交对比任务。
        图3创建对比任务   
        ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001981532357.png "点击放大")
        - 对比类型：分为行数对比和内容对比。
          ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
          - 任务进入增量阶段后，用户可以创建行对比或内容对比任务。
          
          - 全量同步完成后，源库数据不能发生变更，否则内容对比结果会不一致。
          
          - Oracle-\>GaussDB集中式版、Oracle-\>GaussDB分布式进入增量校验状态后，对比服务会开始通过解析的该任务涉及的表的增量日志抽取数据，持续对比。如果用户想要对比其他表的同步状态，可以取消正在对比的任务，创建新的对比任务。
          
          - 内容对比支持"复核"，包括静态对比和动态对比。关于复核，有如下须知内容：
            - 对某次对比不一致行的结果，触发"复核"操作后，重新对比其内容是否一致，如果一致则删除不一致内容，同步变更表对比结果状态和库统计状态，如果不一致，维持原样。
            
            - 任务状态为"增量对比"、"已完成"、"已取消"时，均支持复核。
            
            - "复核"功能不需要执行Recheck，"复核"仅支持复核可对比但存在不一致数据的表，不可对比的表不支持。
            
            - "复核"功能仅针对某次内容对比任务，不支持更细粒度的数据复核，譬如仅复核某张表。
            
            - "复核"进程同时仅允许1个进程执行，但复核进程与其他进程不冲突。
            
            - "复核"任务会同步触发一个DRS任务日志输出，暂不支持限速。
            
            - 无主键表不支持"复核"。
            
            - 任务状态包括：待对比、全量对比中、增量对比中、已完成、取消中、已取消、复核中、复核完成。复核中和复核完成可能和其他状态存在重叠，譬如增量对比中的任务也支持复核。
             
            
        
        - 对比方式：分为静态对比和动态对比两种。
          - 静态对比：对源数据库和目标数据库进行一次全量内容对比，内容对比完成后对比任务结束，适用于无数据变化的非业务时间。
          
          - 动态对比：先对源数据库和目标数据库进行一次全量内容对比，对比任务完成后进入增量对比阶段，实时比对源数据库和目标数据库的增量数据，适用于有数据变化的业务时间。
          
          
          ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
          - 目前仅MySQL引擎支持对比方式选择。
          
          - 选择库级迁移时，动态对比过程中不支持在源库创建新表。如需创建，请先取消动态对比，待新表创建并迁移完成后，再重新启动动态对比。
            
        
        - 对比时间：可设置为"立即启动"和"稍后启动"。由于同步具有轻微的时差，在数据持续操作过程中进行对比任务，可能会出现符合实际情况的少量数据不一致对比结果，推荐结合对比定时功能，选择在业务低峰期进行对比，得到更为具有参考性的对比结果。
        
        - 流速模式：目前部分对比功能支持流速控制，开启流速控制后，可选择"全天限流"的"流速大小"或"时段限流"的"时间范围"与"流速大小"。 ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000002363640686.png "点击放大")
          
        
        - 仅对比增量数据：目前部分对比功能支持仅对比增量数据，选择"动态对比"时，部分对比功能支持"仅对比增量数据"，此时对比会忽略全量静态部分的数据，并根据指定的"增量数据起始时间"，对比增量部分的数据。 ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000002363800782.png "点击放大")
          
        
        - 进行数据过滤：开启后，可根据配置的过滤条件进行对象比对。
          ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
          目前实时迁移仅支持MySQL-\>MySQL设置数据过滤对比。
          选择开启数据过滤后，需要为选择对比的表对象添加过滤条件。
          在过滤条件区域，填写过滤条件后，单击"校验规则"。
          ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
          - 过滤表达式不支持使用某种数据库引擎特有的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万张表情况下进行条件过滤。
           
          校验通过后，单击"生成加工规则"，即可在加工规则表格中看到该规则。
          检查无误后，单击"确定"，创建对比任务。
          
        
        - 对象选择：可根据具体的业务场景选择需要进行对比的对象。
        
        
        ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
        选择对象的时候，对象名称的前后空格不显示，中间如有多个空格只显示一个空格。
        
     
     3. 对比任务提交成功后，返回"数据级对比"页签，单击![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001950412928.png)刷新列表，可以查看到所选对比类型的对比结果。
        若需要查看对比类型详情，可单击指定对比类型操作列的"查看对比报表"，然后选择需要进行对比的数据库，单击操作列的"查看详情"，查看指定源数据库和目标数据库的对比结果详情。
        - 部分对比任务支持"暂停"或"继续"对比，支持在行对比、静态对比或动态对比中操作"暂停"，此时对比任务会完全停止不再查询源库或目标库，"继续"对比任务时，会从任务"暂停"或"失败"时的断点继续对比后续内容，已完成的表不会重复对比。
        
        - 支持限速的对比中的对比任务，列表界面支持查看"源库抽取速率"和"增量时延"（仅"动态对比"）信息。 ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000002363802230.png "点击放大")
          - 注意：上述统计信息默认每10秒刷新一次。
           
        
        - 支持限速的运行中的对比任务，单击"查看对比报表"支持查看全量对比进度、全量抽取速率、差异待复查行数、以及各个源库和目标库对应表的详细进度信息，同时如果任务包括动态对比，支持查看增量对比时延、增量速率、增量位点、差异待复查行数、每秒对比行数信息。 ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000002363803846.png "点击放大")
          - 注意：上述统计信息默认每10秒刷新一次。
           
        
        
        ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
        - 运行中的任务可以随时取消，已取消的对比任务也支持查看对比报表。
        
        - 行对比结果可按照"源库表行数"或"目标库表行数"，对当前页面显示的结果进行升序或者降序排列，方便进行筛选。
        
        - 行对比差异显示为负数时，代表目标库表行数比源库表行数多；显示为正数时，代表源库表行数比目标库表行数多。
          
       
   
   - 创建**数据级对比** **（抽样对比）** ：当数据量过大时，行数对比和内容对比需要较长时间，推荐使用抽样对比，设置适当的抽样比例可以在较短时间内获取到对比结果。
     在"数据级对比"页签，单击"创建对比任务"，选择"抽样对比"，设置"抽样比例"、"对比时间"和"对象选择"后，单击"确定"提交对比任务。
     ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
     - 目前实时迁移支持MongoDB-\>DDS、DDS-\>MongoDB链路支持抽样对比。
     
     - 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条不一致数据。
      
     图4抽样对比   
     ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001981612493.png "点击放大")
     
     
   
   - **用户对比** ：进行数据库账号和权限对比。单击"用户对比"页签，可查看数据库账号及权限的对比结果。
     MySQL-\>MySQL、MySQL-\>TaurusDB、MongoDB相关链路在用户对比页面，支持单击"开始对比"后稍等一段时间再单击![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000002563810536.png)，查看各个对比项的对比结果。
     图5用户对比   
     ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001950412936.png "点击放大")
     ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
     - 全量迁移中的任务无法进行用户对比。
       
   
   - 业务割接前，进行割接复查。 单击"割接复查"，进入创建对比任务页面，单击"创建对比任务"，选择"对比类型"、"对比时间"和"对象选择"，单击"确定"，提交对比任务。
     查看对比详情的方法请参考[2.c]。
     
   
   - 结束任务。 业务系统和数据库切换成功后，为了防止源数据库的操作继续同步到目标数据库，造成数据覆盖问题，此时您可选择结束迁移任务。该操作仅删除了迁移实例，迁移任务仍显示在任务列表中，您可以进行查看或删除。结束迁移任务后，DRS将不再计费。
     一般情况下，结束任务功能可以确保特殊对象迁移的完整性（触发器、事件在结束阶段迁移），罕见情况下（例如网络异常）可能结束任务失败。当遇到多次任务结束失败时，可以勾选"强制结束任务"优先结束任务，以减少等待时间。强制结束任务，极端场景下可能会导致触发器、事件迁移不完整，请手工迁移触发器、事件。
     
   
   
   
   
 
 #### 周期性对比
周期性对比是DRS定时对源数据库与目标数据库表的行数或对象进行对比，并展示结果。
1. 在"实时迁移管理"界面，选中指定迁移任务，单击任务名称，进入"基本信息"页签。
2. 单击"迁移对比"页签，进入"迁移对比"信息页面。
3. 选择"周期性对比"页签，单击"修改对比策略" 
   ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
   目前仅支持MySQL-\>MySQL、MySQL-\>TaurusDB迁移支持周期性对比设置。
   
   
4. 在"修改对比策略"对话框中，开启周期性对比并设置对比频率、时间等策略，单击"是"完成设置。 
   ![](https://support.huaweicloud.com/realtimemig-drs/public_sys-resources/note_3.0-zh-cn.png)
   - 开启后，DRS会按照设置的定时策略进行行数或对象对比，对比结果需要在对应的数据级对比或对象级对比页签中查看。
   
   - 关闭周期性对比后，下一次的周期性对比将不会再进行，历史对比结果仍可正常查看。
   
   - 修改检查设置不会影响当前在进行的周期性对比任务，修改后的设置下次生效。
   
   - 周期性对比会在源和目标端执行一定的读取操作，请选择无业务期时间点进行对比。
   
   - 周期性对比自动剔除超大表（行数超过一亿行），该类大表建议采用数据级对比功能进行抽查，不建议作为周期性对比表。
   
   - 当对比频率选择每周对比但是勾选全部对比时间（即周一到周日全部勾选）时，任务会根据设置将任务的对比频率自动转换为每天对比。
    
   图6修改对比策略   
   ![](https://support.huaweicloud.com/realtimemig-drs/figure/zh-cn_image_0000001877271292.png "点击放大")
   
   
   
 
#### 创建快捷对比
为了加快割接过程，简化对比的操作步骤，提升操作效率，DRS提供快捷对比的功能，无需进入具体实例，在迁移管理界面即可进入对比界面。该功能只支持对比所有迁移对象，且只有增量迁移中的任务才可以使用该功能。
1. 在"实时迁移管理"页面，选择指定的实时迁移任务，单击"操作"列的"数据对比"。
2. 在"创建对比任务"页面，根据业务需要，选择"立即启动"或"稍后启动"后，单击"是"启动对比任务。
 
#### 查看对比任务
1. 在"实时迁移管理"页面，选择指定的实时迁移任务，单击"操作"列的"查看对比"。
2. 在"迁移对比"页签，可查看数据对比结果。
 
#### 数据修复
静态内容对比完成后，当结果中存在不一致数据时，可在对比报表的明细页中选取不一致的表进行数据修复。数据修复结果为可在目标库执行的修复SQL。修复完成后可在对比报表的修复进度明细页查看不一致行的修复SQL生成详情，也可导出和下载针对本次对比所有已生成的不一致SQL，并结合实际情况在目标库手动执行修复SQL。数据修复具有如下约束。
1. 当前仅支持MySQL-MySQL、MySQL-TaurusDB链路。
2. 当前仅支持在静态内容对比完成后，进行数据修复操作。
3. 对于修复SQL为INSERT或UPDATE语句的场景，修复SQL中将展示不一致行的所有列内容，列值为对应列在源库的当前值。
4. 历史的比对任务可能由于缺少修复信息而修复失败，需要重新比对后再进行修复。
5. 每个迁移任务仅保留最新一次数据修复的修复进度明细信息页面。
6. 单个不一致行的数据大小最大支持4M，超过时对应的修复SQL将生成失败。
7. 对于无主键表的数据修复，同一修复SQL可能因数据重复而需执行多次。如果该SQL所需执行次数大于5次，或其重复后的SQL总大小超过4MB，则结果中仅显示该SQL一次，并在注释中注明次数；否则，将按实际次数重复显示。
8. DRS生成的修复SQL中，时间类型字段的内容是基于UTC时间的，如果表中存在时间字段，目标库执行修复SQL前需先将会话时区设置为0时区。各数据库类型对应的会话时区设置SQL示例如下表。
9. 请谨慎执行修复SQL中的DELETE语句。
表2各数据库类型设置会话时区为0时区的SQL示例 
| 数据库类型 | 时区设置SQL                         |
|:---|:---|
| MYSQL | SET session time_zone='+00:00'; |
   
