在 OceanBase 数据库 V4.x 架构下的 clog 盘,日志盘进行了租户级拆分,意味着无法再以 OceanBase 数据库 V3.x 版本的视角判断 clog 是否盘满,例如通过 df -h 命令查看 clog 盘是否使用超过 80%,而是需要通过查看租户的日志盘使用判断租户的日志盘是否满。
以下内容介绍在 OceanBase 数据库 V4.x 版本如何排查 clog 盘满。
如何判断日志盘是否爆
根据视图 gv$ob_units 可以查看租户日志盘使用是否超过磁盘回收水位线(默认是 80%,可以通过配置项调整):
obclient> select tenant_id, svr_ip, svr_port, LOG_DISK_IN_USE, LOG_DISK_SIZE from gv$ob_units where LOG_DISK_IN_USE > LOG_DISK_SIZE*0.8;
如果上述结果返回非空,说明系统存在异常,需要进一步排查。
确定租户下日志流日志盘使用异常情况
如果发现有租户的日志盘使用超过租户日志盘规格的 80%,需要进一步查询 __all_virtual_log_stat,其中(endlsn - baselsn)表示对应日志流还不能回收的日志量(字节),当使用超过 128MB 时,同时日志盘存在爆的情况,那么该日志流一定阻塞日志回收,具体的 SQL 语句:
obclient> select * from __all_virtual_log_stat where tenant_id = xxxx and svr_ip = 'xxxx' and svr_port = xxxx and end_lsn-base_lsn >128*1024*1024 ;
如果上述结果查询为空,请联系技术支持人员跟进。
若虚拟表无法访问,可以通过 grep 以下几条日志,也可以确定哪个日志流阻塞日志回收:
grep 'ERROR.*Txxxx_PalfGC' observer.log.*
[2022-07-19 21:34:37.191950] ERROR [PALF] try_recycle_blocks (palf_env_impl.cpp:637) [147234][T1010_PalfGC][T1010][Y0-0000000000000000-0-0] [lt=21] clog disk space is almost full(total_size(MB)=165888, used_size(MB)=132710, used_percent(%)=80, warn_size(MB)=132710, warn_percent(%)=80, limit_size(MB)=157593, limit_percent(%)=95, maximum_used_size(MB)=74026, maximum_log_stream=1006, oldest_log_stream=1004, oldest_timestamp=1658223124759857784) BACKTRACE:0x434d92e 0xc1a323a 0xc194b93 0x44726d4 0x447239f 0x44721cb 0x4471ffd 0x45b102c 0x45b0339 0x43671aa 0x4365b6d 0x521ebf9 0xc396ec6 0xc391b19 0x7f337d6bfe24 0x7f337cf68f1c
maximum_log_stream:表示使用日志盘空间最多的日志流。oldest_log_stream:表示日志最旧的日志流。
日志盘爆问题排查
明确日志回放/回调是否有问题
根据确定租户下日志流日志盘使用异常情况获取到的租户、日志流以及盘爆机器进行如下操作:
如果副本角色是 leader,请参考日志未回调/同步超时问题排查手册进行排查。
如果副本角色是 follower,请参考排查 OceanBase 数据库 V4.0 版本中 ReplayService 问题进行排查。
注意
如果租户或者日志流不存在了,可以使用 grep Txxx.*PALF_DUMP.*role 命令查询副本是否为 leader/follower。
明确冻结是否有问题
明确冻结流程是否存在问题,详细可参见 冻结与转储流程对应日志情况。
明确转储是否有问题
明确转储流程是否存在问题,详细可参见 冻结与转储流程对应日志情况。
适用版本
OceanBase 数据库 V4.x 版本。