基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
INSERT UP 开启 GTS 误报 4377
更新时间:2026-08-21 03:56
问题现象
在执行包含主表与全局非唯一索引的并发更新操作时,若主表与全局索引位于不同的日志流上,且存在一个 INSERT ON DUPLICATE KEY UPDATE 语句因 TRY INSERT 冲突而触发后续的 DELETE + INSERT 操作,系统可能在查询快照点位于事务提交之后的情况下,仍报错 [errcode=-4377] Fatal Error!!! Catch a defensive error!,表现为日志中频繁刷出 4377 错误。
关键诊断信息
- 主表与全局索引位于不同的日志流上。
- 表上存在全局非唯一索引。
- 存在并发事务对同一数据行进行更新,其中包含
INSERT ON DUPLICATE KEY UPDATE语句。 INSERT ON DUPLICATE KEY UPDATE语句的TRY INSERT阶段发生冲突,并产生了冲突日志。INSERT ON DUPLICATE KEY UPDATE语句后续的UPDATE(DELETE+INSERT)任务中,主表操作为远程执行。
问题原因
开启 INSERT UP GTS 优化后,INSERT ON DUPLICATE KEY UPDATE 语句的执行流程 中,主表与全局索引因位于不同日志流,获取读快照的时序可能不一致。当发生冲突后,获取旧行与后续更新操作使用的读快照不同,若此时存在并发事务恰好在两个快照之间提交,使用较早快照读取到的旧行将与已提交状态不一致,从而触发防御性校验失败,误报 4377 错误。
此问题仅在主表任务为远程执行时发生。如果主表任务本地执行,则会因 6001 错误触发重试,从而规避此问题。
问题风险及影响
- 业务影响:SQL 执行报错 4377,影响业务的连续性。
- 系统稳定性:触发 OBServer 防御性错误。
- 数据一致性:虽然表现为“数据一致性校验失败”,但实质为误报。当前机制是为了防止潜在的真实数据不一致而主动阻断,未造成实际的数据损坏,但存在潜在的查询结果不一致风险。
适用版本
OceanBase 数据库 V4.3.5(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
临时应急处理方法
通过以下命令关闭 insert up GTS 优化,可以避免触发该问题:
-- 执行以下命令关闭优化
ALTER SYSTEM SET _enable_insertup_replace_gts_opt = false;
警告
该参数为隐藏参数,需整体评估对于性能的影响于业务,建议在测试环境验证后在生产环境业务低峰期执行,请勿在生产库上自行调整,请联系咨询 OceanBase 技术支持团队获得帮助。
长期解决方法
若问题持续存在,建议在不影响业务的前提下,调整主表与全局索引的部署策略,确保其位于同一日志流上,以规避该场景。
规避方式
- 关闭 GTS 优化。
- 避免在主表与全局非唯一索引位于不同日志流的场景下,使用
INSERT ON DUPLICATE KEY UPDATE语句的 GTS 优化。 - 在高并发更新场景中,避免对同一数据行同时执行
INSERT ON DUPLICATE KEY UPDATE与并发更新事务。 - 若必须使用
INSERT UPGTS 优化,建议调整主表与全局非唯一索引到同一日志流。