实时同步常见问题

本文为您介绍实时同步的相关问题。

文档概述

问题分类

相关文档

实时同步任务配置须知

实时同步MySQL数据常见问题

实时同步MySQL数据源的数据时,一开始读到数据,一段时间后无法读到数据,怎么处理?

实时同步Oracle、PolarDB、MySQL常见问题

实时同步Oracle、PolarDB、MySQL任务重复报错

报错信息与解决方案

报错信息与解决方案

  • 实时同步Kafka数据报错: Startup mode for the consumer set to timestampOffset, but no begin timestamp was specified.

  • 实时同步MySQL数据报错:

    • Cannot replicate because the master purged required binary logs.

    • MySQLBinlogReaderException

    • show master status' has an error!

    • parse.exception.PositionNotFoundException: can't find start position forxxx

    • 数据库位点过期,请重新选择位点,源库可用最早位点xxx

  • 实时同步Hologres数据报错:permission denied for database xxx

  • 实时同步至MaxCompute数据报错:ODPS-0410051:invalid credentials-accessKeyid not found

  • 实时同步至Oracle报错:logminer doesn't init, send HeartbeatRecord

实时同步任务配置须知

实时同步任务支持哪些数据源?

实时同步支持的数据源请参考文档:实时同步支持的数据源

为什么实时同步任务延迟较大?

当您在查询实时同步任务产出的表数据,发现数据未同步时,原因可能是实时同步任务出现延迟,您可以进入运维中心的实时同步任务界面,查看任务的业务延迟数值是否过大。详情请参见实时同步任务延迟解决方案

若业务延迟较大,其可能原因如下:

报错现象

直接原因

解决方案

读端延迟大

源端数据量变更过多。

延迟突然增大,说明某一时间点源端数据量增加。

若源端数据更新快,数据量多,但同步延迟大,您可以:

  • 修改任务配置:您可以在源端数据库最大连接数许可范围内,基于同步库或表个数综合评估调整实时同步并发数。

    说明

    并发设置上限为当前资源组支持的最大并发数。不同规格资源组支持的最大并发数或任务数不同,详情请参见:DataWorks资源组概述。设置并发时,源端若为RDS可结合数据库允许的最大连接数进行评估,LogHub可根据shard数来设置。

  • 升级资源组规格:当源端数据量增大,或者同步解决方案任务重新编辑过同步任务(将任务由读取单库单表变更为读取多库多表),导致当前资源组消耗不了当前同步数据量级,此时您可选择扩大资源组规格,资源组规格调整详情请参考:变更规格操作

同步起始位点设置较早。

若起始位点比较早,实时同步任务追平数据需要一定时间。

写端延迟大

目标数据库性能、负载等问题

当数据库负载较高时,单一的调整同步任务并发并不能解决问题,您需要联系数据库管理员寻求相关帮助。

读写端延迟大

使用公网同步,网络问题导致同步任务延迟。

公网同步无法保障实时同步时效性,建议您打通网络后通过内网同步数据。

说明

公网同步存在以下风险:网络可能不稳定,丢包等时常发生,影响同步性能,安全性不高。

若源端和目标端数据库性能差异较大或数据库负载较高,同样会导致延迟较大。

当数据库负载较高时,单一的调整同步任务并发并不能解决问题,您需要联系数据库管理员寻求相关帮助。

实时同步任务为什么不建议使用公网?

实时同步任务使用公网时,会存在以下风险:

  • 网络可能不稳定,丢包等时常发生,影响同步性能。

  • 安全性不高。

实时同步字段格式问题

数据集成实时同步在同步MySQL、Oracle、Loghub和PolarDB类型的数据至DataHub或Kafka时,会在同步的目标端添加5个附加列,以进行元数据管理、排序去重等操作。详情请参见实时同步字段格式

实时同步数据时,如何处理TRUNCATE?

实时同步支持TRUNCATE的,在增全量合并的时候会生效。如果选择忽略TRUNCATE,可能会导致进行实时数据同步时出现多的数据。

如何提高实时同步的速度和性能?

如果同步写入速度较慢,可以适当增加写入端并发数,调整JVM参数,JVM参数与同步库数量无关,和变更频率有关。在当前资源组机器允许情况下,内存给的越大,Full GC频率会越小,实时同步性能相应也会越高。实时同步01实时同步2

实时同步是否支持在界面运行?

实时同步不支持在DataWorks的界面上直接运行,您需要在配置好实时同步任务后,提交并发布实时同步节点后,进入生产环境运行该节点。详情请参见实时同步任务运维

实时同步MySQL数据源时速度为什么会变慢?

原因之一就是同步的binlog变多,因为binlog是实例级别,即便配置的同步任务只同步了表A,那么没有在任务中的表B、表C等如果发生变更,也会生成binlog,这些额外增加的binlog就会使同步处理的速度变慢。

实时同步中选择单库与选择多库的内存占用模式为什么会有差异?

选择大于等于2个库时就进入了“整实例”实时同步的模式,此时资源的占用要高于2个单独只有一个库的实时任务。

实时同步任务DDL策略都有哪些?

处理方式如下:

正常处理

忽略

报警

出错

此DDL消息将会继续下发给目标数据源,由目标端数据源来处理,不同目标端数据源处理策略可能会不同。

丢弃掉此DDL消息,目标端数据源不会做任何处理。

丢弃掉此DDL消息,同时发送告警信息。

说明

如果实时任务未配置对应报警规则,则无法收到对应的报警信息。

直接让实时同步任务以出错状态终止运行。

说明

如果实时任务配置了任务状态对应的报警规则,则可以收到对应的报警信息。

DDL类型划分:

新建表

  • 写入Hudi的实时任务,支持正常处理。

    说明

    当新创建的表名满足实时任务配置的筛选规则时,则会在目标端创建对应的表。

  • 分库分表类实时任务,创建符合规则的子表时,会把子表的数据同步到目标表中。并不会新建目标表。

  • 其他类型暂不支持正常处理,只能选择忽略、报警、出错。

删除表

  • 分库分表类实时任务,支持正常处理。当删除符合规则的子表时,被删除子表的数据不再同步,但不会删除目标表。

  • 其他类型暂不支持正常处理,只能选择忽略、报警、出错。

新增列

  • 写入Odps(MaxCompute)、Hologres、MySQL、Oracle、ADB for MySQL的实时任务,支持正常处理。

    说明

    在源端执行加列时,建议在字段列表尾部追加新字段,不推荐在字段中间插入新的字段,否则可能会导致数据同步异常。

  • 其他类型暂不支持正常处理,只能选择忽略、报警、出错。

删除列

暂不支持正常处理,只能选择忽略、报警、出错。

重命名表

暂不支持正常处理,只能选择忽略、报警、出错。

重命名列

暂不支持正常处理,只能选择忽略、报警、出错。

修改列类型

  • 写入Hudi的实时任务,支持正常处理,详情请参考Schema Evolution

  • 其他类型暂不支持正常处理,只能选择忽略、报警、出错。

清空表

  • 写入Odps(MaxCompute)、Hologres、MySQL、Oracle、ADB for MySQL的实时任务,支持正常处理,清空目标表数据。

  • 分库分表类实时任务,某一子表发生truncate时,删除目标表中该子表的数据。

  • 其他类型暂不支持正常处理,只能选择忽略、报警、出错。

写入目标数据源时,对源端DDL及DML操作的注意事项

  • 当源端新增列,并在目标端正常执行后,会有以下限制:

    • 当新增DEFAULT VALUE列后,目标表该新列不会有值,会一直为NULL,后续当源端新增列中新增数据时,实时同步任务会将新增数据同步至该列。

    • 当新增VIRTUAL列后,目标表该新列不会有值,会一直为NULL,后续当源端新增列中新增数据时,实时同步任务会将新增数据同步至该列。

  • MySQL和PolarDB MySQL源端实时同步,建议您在源端新增列时采用末尾追加列方式,不要采用在中间字段加列方式。如果源端无法避免中间字段加列,需要注意以下约束条件:

    • 全增量解决方案中,在全量同步阶段不要进行中间字段加列,否则会导致实时同步阶段数据异常。

    • 实时同步阶段,同步位点重置时间需要设置在中间字段加列DDL事件之后,否则会导致后续实时同步数据异常。

  • 如果发生数据异常,可以重新进行全量数据初始化方案(只需要将中间加列的表剔除,然后重新进行数据初始化,不需要将整个任务所有表进行全量初始化),恢复正确数据。

源表有默认值,通过数据集成创建的目标表,默认值、非空属性等会保留吗?

创建目标表时候,DataWorks只会保留源表的列名、数据类型、注释等信息,不会保留源表的默认值、约束(包含非空约束、索引等)。

读取Postgres的实时同步任务Failover了,延迟为什么很大?

这是Postgres本身数据库的特性,如果接受不了延迟,您可以停止任务,并重新启动任务做一次全增量数据同步。

实时同步MySQL数据常见问题

实时同步MySQL数据源的数据时,一开始读到数据,一段时间后无法读到数据,怎么处理?

  1. 可在数据库执行以下命令,查看当前这个数据库实例正在写入的binlog文件。

    show master status 
  2. 对比日志中读到的binlog文件,在日志中搜journalName=MySQL-bin.000001,position=50,确认是否有数据写入数据库。

  3. 如果有数据在写入,但是binlog却没有往前推进,请联系DBA处理。

实时同步Oracle、PolarDB、MySQL常见问题

实时同步Oracle、PolarDB、MySQL任务重复报错

  • 现象:实时同步任务重复报错。

    实时同步来源为Oracle、PolarDB、MySQL数据源时,默认不支持处理源端DDL消息,当进行除新建表以外的DDL变更时,实时任务将报错退出。断点续传情况下,可能存在源端未产生DDL消息,但同步仍然报错的情况。

    说明

    为避免数据在某时间段内丢失或错乱,禁止使用Rename命令将两列的名称互换。例如,将A列和B列的列名做了调换操作。

  • 原因:由于实时同步支持断点续传,为保障不丢失数据,在重启实时同步回溯位点时可能会往前回溯一部分数据,此过程可能导致之前的DDL消息再次被读取而再次报警。

  • 解决方案:

    1. 当源端产生DDL变更时,手动在目标端数据库进行相应的DDL变更。

    2. 启动实时同步任务并变更DDL消息处理策略,由出错改为忽略

      说明

      由于断点续传还会订阅到该DDL事件,为了避免任务依然失败,所以暂时改为忽略。

    3. 停止实时同步任务并再次修改DDL消息处理策略,由忽略还原为出错,并再次重启实时同步任务。

报错信息与解决方案

Kafka实时同步报错: Startup mode for the consumer set to timestampOffset, but no begin timestamp was specified.

请重置启动位点。实时同步报错-kafka

MySQL实时同步报错:Cannot replicate because the master purged required binary logs.

MySQL实时同步报错:Cannot replicate because the master purged required binary logs. Replicate the missing transactions from elsewhere, or provision a new slave from backup.时,可能是因为在MySQL未找到消费位点的binlog记录,请检查您MySQL的binlog保留时间,同步任务启动时请将该位点配置在这个时间范围内。

说明

如果您订阅不到binlog,可以尝试重置位点到当前时间。

MySQL实时同步报错:MySQLBinlogReaderException

MySQL实时同步报错:MySQLBinlogReaderException: The database you are currently syncing is the standby database, but the current value of log_slave_updates is OFF, you need to enable the binlog log update of the standby database first. 时,可能是因为备库没有开启binlog,如果您要同步备库,需要做备库级联开启binlog,可以找DBA寻求帮助。

开启binlog的操作详情可参见步骤3:开启MySQL的Binlog

MySQL实时同步报错:show master status' has an error!

MySQL实时同步报错:show master status' has an error!,报错详情为Caused by: java.io.IOException: message=Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation, with command: show master status时,可能是因为数据源没有开启对应数据库的权限。

数据源配置账号需要拥有数据库的SELECT、REPLICATION SLAVE、REPLICATION CLIENT权限。给数据源添加数据库对应权限的操作详情可参见步骤2:创建账号并配置权限

MySQL实时同步报错:parse.exception.PositionNotFoundException: can't find start position forxxx

同步未找到位点,请重置位点。

MySQL实时同步报错:数据库位点过期,请重新选择位点,源库可用最早位点xxx

  • 重置位点:在启动实时同步任务时,重置位点并选择源库可用的最早位点。

  • 调整Binlog保留时间:如果数据库位点过期,可以考虑在MySQL数据库中调整Binlog的保留时间,例如设置为7天。

  • 数据同步:如果数据已经丢失,可以考虑重新全量同步,或者配置一个离线同步任务来手动同步丢失的数据。

实时同步Hologres报错:permission denied for database xxx

实时同步Hologres数据时,需要在Hologres给当前操作用户Hologres实例的admin权限(需要有创建schema的权限),操作详情可参见Hologres权限模型概述

实时同步至MaxCompute报错:ODPS-0410051:invalid credentials-accessKeyid not found

当实时同步至MaxCompute数据源且使用临时AK进行同步时,临时AK超过7天会自动过期,同时,将导致任务运行失败。平台检测到临时AK导致任务失败时会自动重启任务,如果任务配置了该类型的监控报警,您将会收到报警信息。

实时同步至Oracle报错:logminer doesn't init, send HeartbeatRecord

实时同步至Oracle任务在初始化找合适的同步位点时,需要加载上一份归档的日志,如果归档日志较大,则需要加载3~5分钟才会完成初始化init阶段。