首批通过分布式安全可靠测评,为关键业务系统打造
执行 DML 并行报错 -4377,message loop is interrupted
更新时间:2026-05-28 02:06
问题描述
执行并行 update SQL 报错。
update /*+ enable_parallel_dml parallel(16)*/ ac04 a set aae677=7486*3,aae678=7486*3, aae679=7486*3, aae680=7486*3, aae013='20220914批量更新202209-202212封顶基数为22458' where aae001 = 2022 and aae140 in ('110', '120', '180','210','310','410') and aae705>7486*3 AND EXISTS (SELECT 1 FROM ac02 WHERE aac001 = a.aac001 AND aae140 = a.aae140 AND aab001 = a.aab001 AND aac031 = '1') AND aab001 not in ( select aab001 from ab01 where aab001 in ( select aab001 from aba1 where bab321='02') and aaa120='1');observer.log报错信息。WARN [SERVER] process (obmp_query.cpp:313) [117010][2582][xxxxx-xxxxx] [lt=6] [dc=0] fail execute sql(sql_id="", sql=update /*+ enable_parallel_dml parallel(16)*/ ac04 a [TRACE [TRACE]obmp_base.cpp:956 [117010][2582][xxxxx-xxxxx] [lt=11] [dc=0] [packet retry query](TRACE=begin_ts=1663159881632355 xxxx-xx-xx xx:xx:xx.xxxxx|[process_begin] u=0 in_queue_time:46256859, receive_ts:1663159835375495, enqueue_ts:1663159881629696|[start_sql] u=0 addr:{ip:"xxx.xxx.xxx.xxx.xxx", port:32043}|[query_begin] u=1 trace_id:xxxxx-xxxxx[before_processor_run] u=2 |[session] u=3 sid:3222219519, tenant_id:1024|[parse_begin] u=18 stmt:"update /*+ enable_parallel_dml parallel(16)*/ ac04 a WARN [SQL.DTL] process_base (ob_dtl_channel_loop.cpp:232) [116982][2526][xxxxx-xxxxx] [lt=6] [dc=0] message loop is interrupted(code={code:-4377, info:{msg:"tid:73549,from:"xxx.xxx.xxx.xxx:xxx",TASK ABORT QC"}}, ret=-4377)
问题原因
OceanBase 数据库 BUG。问题存在于 OceanBase 数据库 V3.1.2 BP5(oceanbase-3.1.2-20211119151959)及以下版本,PDML 中 DML 算子和 TABLE SCAN 算子形成 PARTITION WISE,没有分配 EXCHANGE 的场景下可能会分配出错误的 PARTITION ID,导致数据写错分区,被 DML 防御拦下。
适用版本
OceanBase 数据库 V3.1.2 BP5(oceanbase-3.1.2-20211119151959)及以下版本。
解决方法
升级至问题已修复版本,目前已修复的版本包括 OceanBase 数据库企业版 V3.1.2 BP6(oceanbase-3.1.2-20211230114204)及以上版本。
应急方案
避免并行 DML。