OBCE-4.2.18 errcode()=-6005,errcode()="OB_TRY_LOCK_ROW_CONFLICT",

【 使用环境 】生产环境
【 OB or 其他组件 】OBCE-4.2.18
【 使用版本 】OBCE-4.2.18
【问题描述】 在zabbix 租户 observer.log 出现大量的 死锁冲突日志,这个怎么排查到是哪条sql 引起的,锁源头是哪个?

[2025-05-06 15:29:01.002410] WDIAG [STORAGE.TRANS] mvcc_write (ob_mvcc_row.cpp:1005) [271860][T1008_L0_G0][T1008][YB42AC132334-000625106A547B82-0-0] [lt=26][errcode=-6005] mvcc write conflict(ret=-6005, ctx={ObI
MvccCtx={alloc_type=0 ctx_descriptor=0 min_table_version=1708482676537232 max_table_version=1708482676537232 trans_version={val:4611686018427387903, v:0} commit_version={val:0, v:0} lock_wait_start_ts=0 replay_c
ompact_version={val:0, v:0}} end_code=0 tx_status=0 is_readonly=false ref=1 trans_id={txid:31341293466} ls_id=1001 callback_alloc_count=0 callback_free_count=0 checksum=0 tmp_checksum=0 checksum_scn={val:0, v:0}
 redo_filled_count=0 redo_sync_succ_count=0 redo_sync_fail_count=0 main_list_length=1 unsynced_cnt=0 unsubmitted_cnt_=0 cb_statistics:[main=1, slave=0, merge=0, tx_end=0, rollback_to=0, fast_commit=0, remove_mem
table=0]}, node=this=0x7ef7e54cbd38 trans_version={val:4611686018427387903, v:0} scn={val:4611686018427387903, v:0} tx_id={txid:31341293466} prev=(nil) next=(nil) modify_count=4294967295 acc_checksum=0 version=1
746515750298236 type=0 flag=0 snapshot_barrier=0 snapshot_barrier_flag=0 mtd={dml_flag:1, buf_len:22} seq_no=1746516541002046, res={can_insert:false, need_insert:false, is_new_locked:false, is_mvcc_undo:false, l
ock_state:{is_locked:true, trans_version:{val:0, v:0}, lock_trans_id:{txid:31341290251}, lock_data_sequence:1746516536323818, lock_dml_flag:1, is_delayed_cleanout:false, mvcc_row:0x7f280a13da48, trans_scn:{val:4
611686018427387903, v:0}}, is_checked:false, tx_node:NULL}, *this={this=0x7f280a13da48 latch_=unlocked flag=11 first_dml=NOT_EXIST last_dml=NOT_EXIST update_since_compact=0 list_head=0x7f35a5d0d498 latest_compac
t_node=(nil) max_trans_version={val:1746516531004371714, v:0} max_trans_id=31341286099 max_elr_trans_version={val:1746516531004371714, v:0} max_elr_trans_id=31341286099 latest_compact_ts=0 last_compact_cnt=0 tot
al_trans_node_cnt=1 max_modify_scn={val:18446744073709551615, v:3} min_modify_scn={val:18446744073709551615, v:3}})

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根因分析场景: 针对锁冲突的根因分析
根因分析命令: obdiag rca run --scene=lock_conflict

日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -uzabbix@zabbix -p****** -Dzabbix’, trace_id=‘Yxx’}”

为了更好地帮助您定位问题,请按照以下步骤操作:

  1. 使用上述 obdiag rca run 命令进行根因分析,该命令将帮助我们找到死锁的具体原因。
  2. 使用上述 obdiag gather scene run 命令采集相关日志,特别是涉及错误码 -6005 的 SQL 和锁冲突信息。请将生成的日志压缩包提供给我们以进一步分析。

另外,为了更全面地了解问题背景,麻烦您提供以下信息:

  1. 死锁发生的具体时间段是什么?是否有特定的操作或业务高峰与此时间重合?
  2. 是否可以提供触发死锁的业务场景或相关的 SQL 示例?
  3. 当前租户的隔离级别设置为何?是否为默认值?
  4. 是否有其他监控指标(如 CPU、内存、IO)在死锁发生时出现异常波动?
  5. 是否可以通过 SHOW ENGINE INNODB STATUS\G 获取到更多关于死锁的详细信息?

感谢您的配合!

附上敏捷诊断工具 obdiag 使用帮助链接

可以这样查一下 看看
select * from __all_virtual_processlist where retry_info like ‘%-6005%’ and total_time > 100 order by total_time limit 1\G

锁冲突根因分析直接用诊断工具obdiag分析

文档:https://www.oceanbase.com/docs/common-obdiag-cn-1000000002821541

历史锁信息可以查的到吗?

可以结合这几个视图尝试分析
CDB_OB_DEADLOCK_EVENT_HISTORY/DBA_OB_DEADLOCK_EVENT_HISTORY/__all_virtual_deadlock_event_history

gv$ob_sql_audit

GV$OB_LOCKS

GV$OB_TRANSACTION_PARTICIPANTS

根据文档库中的信息,您可以查询历史锁信息,具体视图和方法如下:

  1. 死锁事件历史记录

    • root 租户下,可以使用视图 CDB_OB_DEADLOCK_EVENT_HISTORY 查询所有租户的死锁事件历史记录。
      • 文档依据:oceanbase.CDB_OB_DEADLOCK_EVENT_HISTORY -> 功能
    • 在非 root 租户下,可以使用视图 DBA_OB_DEADLOCK_EVENT_HISTORY 查询当前租户的死锁事件历史记录。
      • 文档依据:oceanbase.DBA_OB_DEADLOCK_EVENT_HISTORY -> 功能
  2. 当前锁状态

    • 使用视图 GV$OB_LOCKSV$OB_LOCKS 查询当前用户各表持锁或请求锁的情况。这些视图可以帮助您了解当前的锁状态,但不包含历史信息。
      • 文档依据:GV$OB_LOCKS -> 功能V$OB_LOCKS -> 功能
  3. 锁定统计信息

    • 如果您关注的是统计信息的锁定情况,可以参考存储过程 lock_table_statslock_partition_statslock_schema_stats 的使用。虽然这些存储过程主要用于锁定统计信息,但它们的状态可能间接反映某些锁的行为。
      • 文档依据:锁定解锁统计信息 -> 锁定功能

查询示例

以下是一些查询历史锁信息的 SQL 示例:

查询死锁事件历史(root 租户)

SELECT * FROM CDB_OB_DEADLOCK_EVENT_HISTORY;

查询死锁事件历史(非 root 租户)

SELECT * FROM DBA_OB_DEADLOCK_EVENT_HISTORY;

查询当前锁状态

SELECT * FROM GV$OB_LOCKS;
-- 或者
SELECT * FROM V$OB_LOCKS;

注意事项

  • 上述视图从 OceanBase 数据库 V4.0.0 或 V4.2.0 版本开始引入,请确保您的版本支持这些功能。
  • 死锁事件历史记录视图中包含了参与死锁的事务信息以及被 kill 的事务标识,这有助于定位问题源头。

如果您需要更详细的分析,建议结合 obdiag 工具采集诊断信息,并进一步排查具体的 SQL 和业务场景。

检索到的文档如下:

  1. oceanbase.CDB_OB_DEADLOCK_EVENT_HISTORY
  2. oceanbase.DBA_OB_DEADLOCK_EVENT_HISTORY
  3. IS_FREE_LOCK
  4. 锁定解锁统计信息
  5. GV$OB_LOCKS
  6. 锁机制
  7. V$OB_LOCKS

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)