基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
kill session 卡住,会话状态为 SESSION_KILLED 的常见原因及解决方法
更新时间:2026-06-12 03:56
问题现象
当需要终止慢查询或长事务时,通常会采取 kill session 的方式关闭活跃会话来达到终止 SQL 执行的目的,但是有时可能会发生会话无法关闭、kill session 卡住的现象,具体表现如下。
kill session 卡住长时间无返回。

通过查看
__all_virtual_processlist中的会话信息,会发现对应会话的 state 为 SESSION_KILLED。查看
__all_virtual_processlist中 info 列值可能为 SQL,也可能为 kill session_id; 并且可能存在嵌套关系。通过 obstack 采集 OBServer 的线程堆栈获取 kill session 相关信息。
发起 kill session 的线程在等待获取 latch。

被 kill 的会话对应的线程在回滚事务,但是事务回滚卡住(事务回滚无法结束),一般卡在
ObScheTransCtx::wait_end_stmt上。Thread 1346403 (TNT_L0_1006) #0 0x00007fd20333ecf6 in ??? from /usr/lib64/libpthread-2.28.so #1 0x0000000009b305c9 in bool obutil::Cond::timed_wait_impl<obutil::Mutex>(obutil::Mutex const&, obutil::ObSysTime const&) const from /home/admin/oceanbase/bin/observer #2 0x000000000b0fc7f8 in oceanbase::transaction::ObTransCond::wait(long, int&) from /home/admin/oceanbase/bin/observer #3 0x000000000b1175b3 in oceanbase::transaction::ObScheTransCtx::wait_end_stmt(long, long) from /home/admin/oceanbase/bin/observer #4 0x000000000b19e55d in oceanbase::transaction::ObTransService::rollback_stmt_(oceanbase::transaction::ObTransDesc&) from /home/admin/oceanbase/bin/observer #5 0x0000000004f37140 in oceanbase::transaction::ObTransService::end_stmt_v2(oceanbase::transaction::ObStmtParam const&, oceanbase::transaction::ObTransDesc&, oceanbase::transaction::ObTransExecResult const&, bool) from /home/admin/oceanbase/bin/observer #6 0x0000000004f34e66 in oceanbase::storage::ObPartitionService::end_stmt_v2(oceanbase::transaction::ObStmtParam const&, oceanbase::transaction::ObTransDesc&, oceanbase::transaction::ObTransExecResult const&, bool) from /home/admin/oceanbase/bin/observer #7 0x0000000004f0de69 in oceanbase::sql::ObSqlTransControl::end_stmt(oceanbase::sql::ObExecContext&, bool) from /home/admin/oceanbase/bin/observer #8 0x0000000004f0c1cf in oceanbase::sql::ObResultSet::end_stmt(bool) from /home/admin/oceanbase/bin/observer #9 0x0000000004f0a6a3 in oceanbase::sql::ObResultSet::close(bool) from /home/admin/oceanbase/bin/observer #10 0x000000000b915318 in oceanbase::observer::ObInnerSQLResult::inner_close(bool) from /home/admin/oceanbase/bin/observer #11 0x000000000b9030eb in oceanbase::observer::ObInnerSQLResult::force_close(bool) from /home/admin/oceanbase/bin/observer #12 0x000000000b906a46 in oceanbase::observer::ObInnerSQLConnection::execute(oceanbase::common::Ob2DArray<oceanbase::common::ObObjParam, 2096128, oceanbase::common::ObWrapperAllocator, false, oceanbase::common::ObSEArray<oceanbase::common::ObObjParam*, 1l, oceanbase::common::ObWrapperAllocator, false> >&, oceanbase::observer::ObInnerSQLResult&, oceanbase::observer::ObVirtualTableIteratorFactory*, bool, bool) from /home/admin/oceanbase/bin/observer #13 0x000000000b90be91 in oceanbase::observer::ObInnerSQLConnection::execute(unsigned long, unsigned long, oceanbase::sql::stmt::StmtType, oceanbase::common::Ob2DArray<oceanbase::common::ObObjParam, 2096128, oceanbase::common::ObWrapperAllocator, false, oceanbase::common::ObSEArray<oceanbase::common::ObObjParam*, 1l, oceanbase::common::ObWrapperAlloc ator, false> >&, oceanbase::common::ObISQLClient::ReadResult&, bool, bool) from /home/admin/oceanbase/bin/observer #14 0x000000000e2ac67b in oceanbase::sql::ObSPIService::inner_open(oceanbase::pl::ObPLExecCtx*, char const*, unsigne d long, long, oceanbase::common::Ob2DArray<oceanbase::common::ObObjParam, 2096128, oceanbase::common::ObWrapperAllocat or, false, oceanbase::common::ObSEArray<oceanbase::common::ObObjParam*, 1l, oceanbase::common::ObWrapperAllocator, fal se> >&, oceanbase::common::ObISQLClient::ReadResult&, oceanbase::sql::ObSPIOutParams&) from /home/admin/oceanbase/bin/ observer #15 0x000000000e2a9c3a in oceanbase::sql::ObSPIService::inner_open(oceanbase::pl::ObPLExecCtx*, oceanbase::common::O bIAllocator&, char const*, unsigned long, long, oceanbase::sql::ObSqlExpression const**, long, oceanbase::sql::ObSqlEx pression const**, long, oceanbase::common::ObISQLClient::ReadResult&, oceanbase::sql::ObSPIOutParams&) from /home/admi n/oceanbase/bin/observer
关键信息
会话的 state 为
SESSION_KILLED。obstack 可以看到堆栈卡在
ObSQLSessionMgr::kill_session上。
问题原因
kill session 线程卡住的原因。
obstack 的信息能够看到两个线程 kill session 卡在等 Latch 上。

kill session 需要等待锁 session lock 和 data lock,当拿到锁之后才会返回成功,所以要去诊断被 kill 的 session 为何长时间不释放锁。
SQL 线程长时间无法被杀死的原因。
常见原因如下:
在事务的语句回滚时,因时间超出了事务的默认 RPC 超时时间,语句回滚失败,语句回滚失败后不断的重试,就无法释放资源。可以调整默认的 RPC 超时时间的隐藏参数
_ob_trans_rpc_timeout值。注意
调整隐藏参数
_ob_trans_rpc_timeout值,建议联系 OceanBase 数据库技术支持。kill session 时事务 scheduler 可能还未创建,导致事务感知不到 session 被 kill,如果该事务执行挂住,则会导致 session 无法 kill。
问题的风险及影响
工作线程无法释放导致 CPU 资源无法释放、事务悬挂无法回滚导致卡转储等一系列问题。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V3.x 版本。
解决方法
通用应急方法: 重启 session 所在节点。
其他方法需具体问题具体分析,可能有用的轻量级解决方法: 切主、转储。
针对语句回滚因为 RPC 超时失败的场景: 可以调整事务 RPC 超时时间。
规避方式
确认 SQL 执行卡住的根因后升级到对应修复版本即可规避 kill session 卡住的问题。