本文为您介绍离线同步的相关问题。

为什么数据源测试连通性成功,但是离线同步任务执行失败?

  • 如果您之前测试连通性通过,请重新测试连通性,确认资源组与数据库当前是可联通状态(确认数据库端无变更)。
  • 请检查测试连通性成功的资源组和任务执行所用的资源组是不是同一个。
    查看任务运行资源:
    • 任务运行在默认的资源组上,日志中会出现如下信息:running in Pipeline[basecommon_ group_xxxxxxxxx]
    • 任务运行在数据集成自定义资源组上,日志中会出现如下信息:running in Pipeline[basecommon_xxxxxxxxx]
    • 任务运行在独享数据集成资源上,日志中会出现如下信息:running in Pipeline[basecommon_S_res_group_xxx]
  • 如果凌晨任务调度时偶尔失败,但重跑又能成功,请检查数据库在报错时间点的负载情况。

如何切换数据集成任务执行资源组?

  • 方式一:运维中心周期任务修改数据集成任务执行资源组。修改资源组1
  • 方式二:数据集成任务配置界面右侧修改数据集成资源组。修改资源组2
    说明 在数据开发切换数据集成任务执行资源组时,需要提交发布,生产环境才会生效。

脏数据如何排查和定位?

脏数据定义:单条数据写入目标数据源过程中发生了异常,则此条数据为脏数据。 因此只要是写入失败的数据均被归类于脏数据。

脏数据影响:脏数据将不会成功写入目的端。您可以控制是否允许脏数据产生,并且支持控制脏数据条数,数据集成默认允许脏数据产生,您可以在同步任务配置时指定脏数据产生条数。详情可参考:配置通道控制
  • 任务设置允许脏数据:当脏数据产生时,任务继续执行,但脏数据将会被舍弃,不写入目的端。
  • 任务控制允许产生的脏数据条数:
    • 设置脏数据允许条数为0条,则当脏数据产生时,任务将失败退出。
    • 设置脏数据允许条数为x条,则当脏数据产生条数超过x条时,任务将失败退出,当脏数据产生条数小于x条时,任务将继续运行,但脏数据将会被舍弃,不写入目的端。

脏数据实时场景分析:

  • 报错现象:报错现象:{"message":"写入 ODPS 目的表时遇到了脏数据: 第[3]个字段的数据出现错误,请检查该数据并作出修改 或者您可以增大阀值,忽略这条记录.","record":[{"byteSize":0,"index":0,"type":"DATE"},{"byteSize":0,"index":1,"type":"DATE"},{"byteSize":1,"index":2,"rawData":0,"type":"LONG"},{"byteSize":0,"index":3,"type":"STRING"},{"byteSize":1,"index":4,"rawData":0,"type":"LONG"},{"byteSize":0,"index":5,"type":"STRING"},{"byteSize":0,"index":6,"type":"STRING"}
  • 如何处理:该日志中可以看出脏数据的字段,第三个字段异常。
    • 脏数据是writer端报的,要检查下writer端的建表语句。odps端该表字段指定的字段大小小于MySql端该字段数据大小 。
    • 数据同步原则:来源端数据源的数据要能写入目的端数据源(来源端和目的端类型需要匹配,字段定义的大小需要匹配),即源端数据类型需要与写端数据类型匹配,源端是VARCHAR类型的数据不可写到INT类型的目标列中;目标端的数据类型定义的大小需要可以接收源端映射字段实际数据大小,源端是long、varchar 、double等类型的数据,目的端均可用string、text等大范围类型接纳。
    • 脏数据报错不清晰时,需要复制出打印出的脏数据的一整条,观察其中的数据,和目的端数据类型比较,看哪一条或哪一些不合规范。
    比如:
    {"byteSize":28,"index":25,"rawData":"ohOM71vdGKqXOqtmtriUs5QqJsf4","type":"STRING"}
    byteSize:字节数;index:25,第26个字段;rawData:具体值(即value);type:数据类型。

如何处理编码格式设置/乱码问题导致的脏数据报错?

  • 报错现象:

    如果数据中包括表情符,在同步过程中可能会报错脏数据:[13350975-0-0-writer] ERROR StdoutPluginCollector - 脏数据 {"exception":"Incorrect string value: '\\xF0\\x9F\\x98\\x82\\xE8\\xA2...' for column 'introduction' at row 1","record":[{"byteSize":8,"index":0,"rawData":9642,"type":"LONG"},}],"type":"writer"}

  • 可能原因:
    • 数据库相关编码未设置为utf8mb4,导致同步表情符报错。
    • 源端的数据本身就是乱码。
    • 数据库和客户端的编码不一样。
    • 浏览器编码不一样,导致预览失败或乱码。
  • 解决方案:

    针对产生乱码的不同原因,选择相应的解决方法:

    • 如果您的原始数据乱码,需首先处理好原始数据,再进行同步任务。
    • 数据库和客户端编码格式不一致,需先修改编码格式。
    • 浏览器编码和数据库或客户端编码格式不一致,需先统一编码格式,然后进行数据预览。
    您可以尝试以下操作:
    1. JDBC格式添加的数据源修改utf8mb4:jdbc:mysql://xxx.x.x.x:3306/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45
    2. 实例ID形式添加数据源:在数据库名后拼接,格式为database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45
    3. 修改数据库相关的编码格式为utf8mb4。例如,在RDS控制台修改RDS的数据库编码格式。
      说明 设置RDS数据源编码格式命令:set names utf8mb4。查看RDS数据库编码格式命令:show variables like 'char%'

数据同步时报错:[TASK_MAX_SLOT_EXCEED]:Unable to find a gateway that meets resource requirements. 20 slots are requested, but the maximum is 16 slots.

  • 可能原因:

    设置并发数太大导致没有足够的资源。

  • 解决方案:
    减小离线同步任务的并发数设置。
    • 如果您使用向导模式配置离线同步任务,需要调小配置通道控制中的任务期望最大并发数,详情可参见配置通道控制
    • 如果您使用脚本模式配置离线同步任务,需要调小配置通道控制中的concurrent参数,详情可参见配置通道控制

任务存在SSRF攻击Task have SSRF attacts如何处理?

目前基于数据库内网的数据源不能使用公共数据集成资源组运行任务,请更换使用独享数据集成资源组运行任务,独享数据集成资源组的使用详情可文档:新增和使用独享数据集成资源组

离线同步报错:OutOfMemoryError: Java heap space

出现上述报错后,您需要:
  1. 如果您使用独享数据集成资源组的话,可以调整jvm参数。
  2. 如果插件配置支持的参数中有batchsize或者maxfilesize,可以调小对应的值。

    您可以查看各插件是否支持上述参数,进入支持的数据源与读写插件文档后,点击对应插件查看参数详情。

  3. 调小并发数。
    • 如果您使用向导模式配置离线同步任务,需要调小配置通道控制中的任务期望最大并发数,详情可参见配置通道控制
    • 如果您使用脚本模式配置离线同步任务,需要调小配置通道控制中的concurrent参数,详情可参见配置通道控制
  4. 如果是文件同步,例如同步OSS文件等,请减少读取的文件数。

离线同步任务执行偶尔成功偶尔失败

出现离线同步任务偶尔执行失败的情况,可能是因为白名单配置不全导致的,您需要检查数据库白名单是否配置完全。
  • 使用独享数据集成资源组时:
    • 如果您此前已经将独享数据集成资源组的弹性网卡IP添加到了数据源的白名单中,后续如果资源组有扩容,您需要及时更新数据源的白名单,将扩容后的资源组的弹性网卡IP添加到数据源白名单中。
    • 为了避免出现资源组扩容后需要再次添加白名单的情况,建议您直接添加独享数据集成资源组绑定的交换机网段作为数据库白名单。详情请参见添加白名单
  • 使用公共数据集成资源组时:

    请确保公共数据集成资源组对应地域的所有IP地址段都已经添加到数据源的白名单配置中。详情请参考文档使用公共数据集成(调试)资源组执行任务时需要在数据库添加的IP白名单

如果白名单无异常,请确认数据库负载是否过高导致连接中断。

添加MongDB数据源时,使用root用户时报错

使用root用户添加MongoDB数据源时报错,是因为添加MongoDB数据源时,必须使用用户需要同步的表所在的数据库创建的用户名,不可以使用root用户。

例如需要导入name表,name表在test库,则此处数据库名称为test,需要使用test数据库中创建的用户的用户名。

MongDB使用的authDB库为admin库,如何同步其他业务库数据?

请在数据源配置中库名填写业务库名,确保username权限正常,若数据源连通性报错auth failed可先忽略。 需要通过脚本模式配置任务,在同步任务json配置parameter配置项中添加"adthDb":"admin"参数。

读取MongDB时,如何在query参数中使用timestamp实现增量同步?

可以使用赋值节点先对date类型时间处理成timestamp,将该值作为MongDB数据同步的入参,详情请参考文档:MongoDB时间戳类型字段如何实现增量同步?

读取oss数据报错:AccessDenied The bucket you access does not belong to you.

数据源配置的ak用户没有该bucket的权限,请为oss数据源配置的ak用户授予该bucket相应权限。

读取oss文件是否有文件数限制?

ossreader插件读取oss文件数datax本身没有限制,主要看任务配置的jvm参数,但是不建议object参数配置*,容易导致内存溢出。

写入redis使用hash模式存储数据时,报错如下:Code:[RedisWriter-04], Description:[Dirty data]. - source column number is in valid!

  • 产生原因:

    Redis在使用hash模式存储时,hash的attribute和value要成对出现。例如:odpsReader: "column":[ "id", "name", "age", "address", ],目标端在配置redisWriter: "keyIndexes":[ 0 ,1],在redis中,id和name将作为key,age将作为attribute,address将作为value存到redis中的hash类型的redis中,如果odps源端只配置了两列,则不可以使用hash模式去存redis缓存,会报该异常。

  • 解决方案:

    假如只想用两列,那就配置redis的tring模式去存信息,如果必须要用hash存,源端至少配置三列。

写入/读取Mysql报错:Application was streaming results when the connection failed. Consider raising value of 'net_write_timeout/net_read_timeout、' on the server.

  • 报错原因:
    • net_read_timeout:datax将rds mysql根据splitpk对mysql的数据进行拆分成数条等量的取数sql(select取数语句),执行时某条sql执行时间超过rds侧允许的最大运行时间。
    • net_write_timeout:等待将一个block发送给客户端的超时时间过小导致。
  • 解决方案:

    在数据源url的连接上增加该参数,net_write_timeout/net_write_timeout设置稍微大一些,或者在rds控制台调整该参数。

  • 改进建议:

    如果任务可以重跑建议设置任务自动重跑。

数据源参数设置

例如:jdbc:mysql://192.168.1.1:3306/lizi?useUnicode=true&characterEncoding=UTF8&net_write_timeout=72000

读取Mysql数据库报错The last packet successfully received from the server was 902,138 milliseconds ago

CPU使用正常,内存使用较高可能导致连接被断开。

如果您确认可以自动重跑的话,建议您设置任务出错自动重跑,详情参考文档:配置时间属性

读取PostgreSQL数据报错,该如何处理?

  • 问题场景:离线同步工具同步PostgreSQL数据时,报错如下:org.postgresql.util.PSQLException: FATAL: terminating connection due to conflict with recovery
  • 可能原因:出现该情况的原因是从数据库中拉取数据的时间较长,请增加max_standby_archive_delaymax_standby_streaming_delay的参数值,详情请参见Standby Server Events

报错Communications link failure,该如何处理?

  • 读取报错
    • 问题现象:

      读取数据时,报错如下:Communications link failure The last packet successfully received from the server was 7,200,100 milliseconds ago. The last packet sent successfully to the server was 7,200,100 milliseconds ago. - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    • 可能原因:

      数据库执行SQL查询速度慢,导致MySQL读超时。

    • 解决方法:
      • 排查是否设置了where过滤条件,以确保筛选字段已添加索引。
      • 排查源数据表的数据是否太多。如果数据太多,建议拆分为多个任务。
      • 查询日志找到执行阻塞的SQL,咨询数据库管理员解决。
  • 写入报错
    • 问题现象:

      写入数据时,报错如下:Caused by: java.util.concurrent.ExecutionException: ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP 'xxx' ATOM 'dockerxxxxx_xxxx_trace_shard_xxxx': Communications link failure The last packet successfully received from the server was 12,672 milliseconds ago. The last packet sent successfully to the server was 12,013 milliseconds ago. More...

    • 可能原因:

      慢查询导致SocketTimeout。TDDL默认连接数据的SocketTimeout是12秒,如果一个SQL在MySQL端执行超过12秒仍未返回,会报4614的错误。当数据量较大或服务端繁忙时,会偶尔出现该错误。

    • 解决方法:
      • 建议数据库稳定后,重新运行同步任务。
      • 联系数据库管理员调整该超时时间。

如何处理表字段名是关键字导致同步任务失败的情况?

  • 报错原因:column中含有保留字段,或者 column配置中含有数字开头的字段。
  • 解决方法:数据集成同步任务转脚本模式配置,对column配置中的特殊字段添加进行转义。字段冲突

离线同步报错Duplicate entry 'xxx' for key 'uk_uk_op'如何处理?

  • 报错原因:Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'cfc68cd0048101467588e97e83ffd7a8-0' for key 'uk_uk_op'
  • 可能原因:数据集成同步任务不允许同一时间运行相同节点的不同实例(即相同json配置的同步任务不能同一时间运行多个,例如5分钟为周期的同步任务,由于上游延迟,在0点5分时调起了原本0点0分的实例和0点5分的实例,这样会导致其中一个实例无法调起,或者任务实例在运行时又进行了补数据、重跑等操作)。
  • 解决方案:错开实例运行时间,如果为小时任务建议设置自依赖

离线同步报错plugin xx does not specify column如何处理?

出现上述报错,有可能是因为同步任务的字段映射配置不正确,或者是插件没有正确配置column。

  1. 检查是否有做字段映射。
  2. 检查插件是否有正确配置column。

读取MaxCompute(ODPS)表数据报错The download session is expired.

  • 报错现象:

    Code:DATAX_R_ODPS_005:读取ODPS数据失败, Solution:[请联系ODPS管理员]. RequestId=202012091137444331f60b08cda1d9, ErrorCode=StatusConflict, ErrorMessage=The download session is expired.

  • 可能原因:

    离线同步读取MaxCompute数据时,使用的是MaxCompute的tunnel命令来进行上传下载数据。Tunnel的Session在服务端的生命周期为24小时,所以离线同步任务如果执行超过24小时任务会失败退出,关于tunnel介绍详情请参见使用说明

  • 解决方案:

    您可以适当调大离线同步任务并发数,合理规划同步的数据量确保任务在24小时内同步完成。

写入MaxCompute(ODPS)报错block失败:Error writing request body to server

  • 报错现象:

    Code:[OdpsWriter-09], Description:[写入数据到 ODPS 目的表失败.]. - ODPS 目的表写 block:0 失败, uploadId=[202012081517026537dc0b0160354b]. 请联系 ODPS 管理员处理. - java.io.IOException: Error writing request body to server。

  • 可能原因:
    • 可能原因1:数据类型异常,即来源数据不符合odps数据类型规范。比如4.2223这个数据值写入odps的decimal(18,10)数据类型的场景。
    • 可能原因2:odps块/通信异常等
  • 解决方案:

    请转换数据类型,使用符合数据类型规范的数据。如果数据类型排查后仍有报错,可提交工单咨询排查。

写入DataHub时,一次性写入数据超限导致写入失败如何处理?

  • 报错现象:

    ERROR JobContainer - Exception when job runcom.alibaba.datax.common.exception.DataXException: Code:[DatahubWriter-04], Description:[写数据失败.]. - com.aliyun.datahub.exception.DatahubServiceException: Record count 12498 exceed max limit 10000 (Status Code: 413; Error Code: TooLargePayload; Request ID: 20201201004200a945df0bf8e11a42)

  • 可能原因:
    报错原因为datax一次性提交到DataHub的数据量超过DataHub的限制。影响提交到DataHub数据量的配置参数主要为:
    • maxCommitSize:表示datax累积的buffer数据,待积累的数据大小达到maxCommitSize 大小(单位MB)时,批量提交到目的端。默认是1,048,576,即1MB数据。
    • batchSize:DataX-On-Flume积累的Buffer数据条数,待积累的数据条数达到batchSize大小(单位条数)时,批量提交至目的端。
  • 解决方案:

    调小maxCommitSizebatchSize的参数值。

配置批量上云时如何给表添加前缀?

比如给原始表名加前缀“AAA_”,可以使用AAA_${db_table_name_sr}

离线同步任务如何自定义表名?

如果您表名较规律,例如orders_20170310orders_20170311orders_20170312,按天区分表名称,且表结构一致。您可以结合调度参数通过脚本模式配置任务自定义表名,实现每天凌晨自动从源数据库读取前一天表数据。

例如,今天是2017年3月15日,自动从源数据库中读取orders_20170314的表的数据导入,以此类推。自定义表名

在脚本模式中,修改来源表的表名为变量,例如orders_${tablename}。由于按天区分表名称,且需要每天读取前一天的数据,所以在任务的参数配置中,为变量赋值为tablename=${yyyymmdd}

说明

更多调度参数的使用问题请参考文档基础属性:调度参数

配置离线同步节点时,无法查看全部的表,该如何处理?

您在配置离线同步节点时,选择来源区域仅默认显示所选数据源中的前25张表。如果数量过大,您可以输入表名进行搜索或使用脚本模式开发。

读取MaxCompute(ODPS)表数据时,添加一行注意事项

  1. 可以输入常量,输入的值需要使用英文单引号包括,例如'abc''123'等。
  2. 可以配合调度参数使用,如'${bizdate}' 等,调度参数具体使用请参考文档基础属性:调度参数
  3. 可以输入你要同步的分区列,如分区列有pt等。
  4. 如果您输入的值无法解析,则类型显示为'自定义'
  5. 不支持配置odps函数。
  6. 如果您手工编辑添加的列显示自定义(例如添加了MaxCompute分区列,LogHub数据预览未预览到的列),不会影响实际任务执行。

读取MaxCompute(ODPS)表数据时,如何同步分区字段?

请在字段映射处选择添加一行,输入分区列明,如分区列有pt等;

读取MaxCompuet(ODPS)表数据时,如何同步多个分区数据?

读取数据所在的分区信息。
  • ODPS的分区配置支持linux shell通配符,*表示0个或多个字符,?表示任意一个字符。
  • 默认情况下,读取的分区必须存在,如果分区不存在则运行的任务会报错。如果您希望当分区不存在时任务仍然执行成功,则可以切换至脚本模式执行任务,并在ODPS的Parameter中添加"successOnNoPartition": true配置。
例如,分区表test包含pt=1,ds=hangzhou、pt=1,ds=shanghai、pt=2,ds=hangzhou、pt=2,ds=beijing四个分区,则读取不同分区数据的配置如下:
  • 如果您需要读取pt=1,ds=hangzhou分区的数据,则分区信息的配置为"partition":"pt=1,ds=shanghai”
  • 如果您需要读取pt=1中所有分区的数据,则分区信息的配置为"partition":"pt=1,ds=*”
  • 如果您需要读取整个test表所有分区的数据,则分区信息的配置为"partition":"pt=*,ds=*”
此外,您还可以根据实际需求设置分区数据的获取条件(以下操作需要转脚本模式配置任务):
  • 如果您需要指定最大分区,则可以添加/*query*/ ds=(select MAX(ds) from DataXODPSReaderPPR)配置信息。
  • 如果需要按条件过滤,则可以添加相关条件/*query*/ pt+表达式配置。例如/*query*/ pt>=20170101 and pt<20170110表示获取pt分区中,20170101日期之后(包含20170101日期),至20170110日期之前(不包含20170110日期)的所有数据。
说明

/*query*/表示将其后填写的内容识别为一个where条件。

如何处理表列名是关键字导致同步任务失败的情况?

  • 问题场景:

    进行同步任务时,需要同步的表的列名是关键字,导致同步任务失败。

  • 解决方案:
    关键字需要添加转移符,向导模式配置任务请通过脚本模式配置任务,在column配置中手动添加转移符。
    • MySQL的转义符为`关键字`
    • Oracle和PostgreSQl的转义符为"关键字"
    • SQlServer的转义符为[关键字]
  • 以MySQL数据源为例:
    1. 执行下述语句,新建一张表aliyun。create table aliyun (`table` int ,msg varchar(10));
    2. 执行下述语句,创建视图,为table列取别名。create view v_aliyun as select `table` as col1,msg as col2 from aliyun;
      说明
      • table是MySQL的关键字,在数据同步时,拼接出来的代码会报错。因此需要通过创建视图,为table列起别名。
      • 不建议使用关键字作为表的列名。
    3. 通过执行上述语句,为有关键字的列取列名。在配置同步任务时,选择v_aliyun视图代替aliyun表即可。

读取Loghub同步某字段有数据但是同步过来为空

此插件字段大小写敏感,请检查loghub reader的column配置。

读取Loghub同步少数据

数据集成取的是数据进入loghub的时间,请在Loghub控制台检查数据元数据字段receive_time是否在任务配置的时间区间内。

读取Loghub字段映射时读到的字段不符合预期

如果出现此现象请在界面手动编辑column。

读取kafka配置了endDateTime来指定所要同步的数据的截止范围,但是在目的数据源中发现了超过这个时间的数据。

kafkareader在读数据的时候,是以batch的形式进行的,在读到的一批数据中,如果有超过endDateTime的,则停止同步,但是超出endDateTime的这部分数据也会被写入到目的端数据源。
  • 您也可以通过skipExceedRecord配置项来指定是否同步超出的数据。详细使用方法见Kafka Reader。【不建议设置为不同步,会有造成丢数据】
  • 您可以通过配置kafka的max.poll.records配置项来指定一次拉取数据的量,结合并发数,来控制可能超出的数据量。超出的数据量 < max.poll.records * 并发数

写入oss出现随机字符串如何去除?

OSS Writer写入的文件名,OSS使用文件名模拟目录的实现。OSS对于Object的名称有以下限制:使用"object": "datax",写入的Object以datax开头,后缀添加随机字符串。文件数由实际切分的任务数有关。

如果您不需要后缀随机UUID,建议您配置"writeSingleObject" : "true",详情请参见OSS Writer文档的writeSingleObject说明。

详情请参考文档:[oss writer](OSS Writer

mysql分库分表如何将分表同步到一张maxcompute表中

您可以参考mysql reader插件文档进行任务配置:MySQL Reader