基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
删租户卡住如何排查
更新时间:2024-06-14 05:56
Drop Tenant 的表现形式如下:
回收站打开回收站,租户状态不变。
回收站关闭时:
- 备库上执行相当于
drop_tenant force。 - 主库上执行会走安全退出,安全退出的含义是:先标记
schema中的dropping状态,然后等待用户租户下的所有日志流 GC 完成后,再删除schema。
- 备库上执行相当于
drop_tenant force:直接从 schema 中删除。
适用版本
OceanBase 数据库 V4.X 版本。
排查步骤
在遇到删租户卡住的时候需要按照以下顺序排查。
确定 schema 状态。
查询
__all_tenant表中关于这个租户的 status 状态。租户不存在,查询
__all_tenant_history表关于这个租户id的最新一条记录是不是is_delete等于 1,如果是,租户已经删除完成,并没有卡住。status为normal:则这个命令都没有在 RS 上执行成功,可能有以下情况: a. RS 不存在:去看 1 租户的 1 号日志流是否有 Leader,RS 是否上任成功。b. RS 的 DDL 队列积压:去看
DDLQueueTh0线程在做什么。status为dropping:这个状态是正常的。
确定日志流状态。
在系统租户下查询
__all_virtual_ls_status表。首先看系统日志流的状态:
a.
PRE_TENANT_DROPPING: 在这个状态是在等其他用户日志流 GC,需要看其他用户日志流为什么不 GC,转到 <3> 继续排查。b.
TENANT_DROPPING: 这个状态是说明日志流已经删除完成,但是系统日志流还没有判定可以 GC,转到 <4> 继续排查。c.
WAIT_OFFLINE: 在等系统日志流 GC,转 <5> 继续排查 。系统日志流为
PRE_TENANT_DROPPING,排查租户下__all_ls表和对应 meta 租户下__all_ls_status表的status是否有差异,也可以在系统租户下直接查询虚拟表__all_virtual_ls/__all_virtual_ls_status表。a. 每个日志流在这两张表上的
status都是一致,没有异常。b.
status表不一致,需要排查T1xxx_PLSSer这个线程在做什么。以某一个用户日志流为例,排查这个日志流的状态。
a.
NORMAL:可能在等用户日志流的sync_scn越过系统日志流的sync_scn,排查__all_tenant_info表汇报是否正常,需要排查T1xxx_TeRec线程是否有回报失败的记录,或者如果每个日志流都汇报到了最新,是否存在无主的日志流。b.
TENANT_DROPPING: 在等底层事务结束,可以排查T1xxx_PLSSer这个线程,转到 <4> 继续排查。c.
WAIT_OFFLINE: 这个状态需要等底层 GC,转到 <5> 继续排查。d.
CREATING/CREATED:这个状态不应该存在,排查T1xxx_PLSSer这个线程。日志流卡在
TENANT_DROPPING状态。 在这个状态需要等T1xxx_PLSSer线程发rpc给日志流的leader询问是否可以 GC,所以需要先去看T1xxx_PLSSer有没有发rpc给日志流的 leader。如果发送了,就拿着 trace 去日志流的 leader 所在的机器上寻找为什么不能 GC 。T1xxx_PLSSer线程关键字:LOG_INFO("[PRIMARY_LS_SERVICE] finish to try delete LS", KR(ret), K(status_info), K(cost), K(can_offline));GC模块关键字:check_ls_can_offline
日志流状态卡在
WAITOFFLINE状态 这个状态下,日志流已经可以 GC ,只需要等待写 offline 日志,并且真正的删除。日志流在这个状态的残留全都是 GC 模块的问题了。可以去日志流 leader 所在的机器上搜T1xxx_GCCollec这个线程上是否有对应日志流的 WDIAG 日志。