首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库对分区的内部表执行多分区操作时报错 4377 (OB_ERR_DEFENSIVE_CHECK)
更新时间:2026-08-06 07:36
问题现象
OceanBase 数据库对分区的内部表执行跨多个分区的 DML 操作时,可能触发报错 OB_ERR_DEFENSIVE_CHECK,日志中出现如下信息。
fatal internal error(msg="Fatal Error!!! Catch a defensive error!", ret=-4377`
关键诊断信息
触发条件
对分区的内部表执行跨多个分区的 DML 操作(如 DELETE、UPDATE)有概率报错。
特别是在 PX 并行查询与 DAS 写入任务并行执行的场景下。
事前巡检
检查是否针对分区的内部表执行了未显式指定分区名的 DML 操作。
确认目标表是否为分区的内部表(如
__all_server_event_history)。
事后诊断
日志中出现如下报错信息:
fatal internal error(msg="Fatal Error!!! Catch a defensive error!", ret=-4377`
问题原因
当在同一个分区的内部表中同时存在两个任务(如 PX 并行读取与 DAS 写入)时,可能引发数据一致性风险,包括但不限于:
报错 4377 (OB_ERR_DEFENSIVE_CHECK)。
更新丢失(Update Lost)等问题。
此类并发冲突是系统为防止数据异常引入的防御性检查机制,虽然不会影响最终一致性,但可能导致操作失败或行为不可预期。
问题的风险及影响
导致对于分区的内部表的跨多个分区的 DML 操作时报错以及 Update 的丢失更新问题。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法及规避方式
可以忽略,不会产生正确性问题。由于该问题不会影响最终数据的一致性,但会导致操作失败或不可预期行为,建议避免对分区的内部表(如 __all_server_event_history)进行多分区操作。
示例说明,假设原 DML 操作分区的内部表(如 __all_server_event_history)语句为:
delete from __all_server_event_history where gmt_create < '2024-03-13 18:41:33' limit 10000;
应修改为依次对分区的内部表的每个分区进行单独操作(如分区的内部表 __all_server_event_history 共 16 个分区):
delete from __all_server_event_history PARTITION(p0) where gmt_create < '2024-03-13 18:41:33' limit 10000;
delete from __all_server_event_history PARTITION(p1) where gmt_create < '2024-03-13 18:41:33' limit 10000;
......
delete from __all_server_event_history PARTITION(p15) where gmt_create < '2024-03-13 18:41:33' limit 10000;
不要对分区的内部表(如 __all_server_event_history)进行跨多个分区 DML 操作,需改为多次对分区的内部表的每个分区进行单独 DML 操作。
警告
对存在分区的内部表 __all_server_event_history 执行 DML 操作存在一定的风险,请勿自行操作。如果需要修改,请联系 OceanBase 技术支持团队获得帮助。