Dataphin管道任务运行报错“org.postgresql.util.PSQLException: ERROR: canceling statement due to user request”

更新时间:

问题描述

Dataphin管道任务将PostgreSQL数据库数据集成同步到MaxCompute数据库,任务运行报错“org.postgresql.util.PSQLException: ERROR: canceling statement due to user request”。完整的异常信息如下:

2022-10-30 00:57:03.062 [job-1661241] INFO  DBUtil - opened connection for jdbc:postgresql://XXX:XXX/prod_r3_oms_sc_sg?currentSchema=XXX
2022-10-30 00:57:03.062 [job-1661241] INFO  SingleTableSplitUtil - split pk [sql=SELECT MIN(id),MAX(id) FROM "prod_r3_oms_sc_sg"."sg_b_storage_prein_ftp" WHERE (to_char(modifieddate, 'YYYYMMDD')  = '20221029' AND id IS NOT NULL)] is running... 
2022-10-30 01:27:03.143 [job-1661241] ERROR DlinkTrans - Exception when job run
com.alibaba.dt.pipeline.plugin.center.exception.DataXException: Code:[DBUtilErrorCode-06], Description:[执行数据库 Sql 失败, 请检查您的配置的 column/table/where/querySql或者向 DBA 寻求帮助.].
 - 执行的SQL为: SELECT MIN(id),MAX(id) FROM "XXX"."XXX" WHERE (to_char(modifieddate, 'YYYYMMDD')  = '20221029' AND id IS NOT NULL) 具体错误信息为:org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
 at com.alibaba.dt.pipeline.plugin.center.exception.DataXException.asDataXException(DataXException.java:40) ~[plugin.center.base-v2.9.5.3-2.RELEASE.jar:na]
 at com.alibaba.datax.plugin.rdbms.util.RdbmsException.asQueryException(RdbmsException.java:97) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
 at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.getMaxMin(SingleTableSplitUtil.java:256) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
 at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.checkSplitPk(SingleTableSplitUtil.java:242) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]

问题原因

根据日志看管道任务是在读取PostgreSQL数据时报错“org.postgresql.util.PSQLException: ERROR: canceling statement due to user request”。该报错的主要原因和字面上的意义一致,“由于用户的请求取消了当前查询的状态”,一般是代码中设置了取消执行当前查询的逻辑代码,从而导致抛出该异常。Dataphin管道任务的输入组件也有设置当读取数据超过30min,数据未返回就取消执行读取操作的代码。因此该问题的原因是客户读取PostgreSQL的数据超过30min导致。

如以下日志显示读取数据的操作刚好是30min:

解决方案

 一般碰到管道任务运行读取数据刚好超过30min,就有数据库读取超时相关报错的时候,都可以考虑底层读取数据的SQL语句执行超过了30min,请求被取消导致。可以建议客户从运行日志中获取SQL拿到对应的数据库执行看看大概需要多久,本问题中SQL如下:

若上述SQL执行未超过30min,需要获取数据库监控日志,看看管道任务运行期间,该SQL实际的执行时间。一般出现管道任务之前运行正常,近期出现该问题的情况,需要考虑下是否近期数据库侧负载情况上升,数据库在高峰期间响应不及时的情况。也可以确认读取的表是否有索引,如果没有索引可以创建索引提高数据库读取效率。

若上述SQL读取超过了30min,更能直接说明数据库返回数据比较慢,需要确认问题出现时,数据库侧负载情况,还有近期有无做其他操作。

若直接获取到SQL在数据库执行未超过30min,但是管道运行期间就有该异常的情况,说明数据库当时负载情况比较高,可能请求量比较大。Dataphin侧可以调整任务调度时间,错开高峰,避免该问题。

适用于

  • Dataphin