【布道师经验分享】Clog 日志盘满(Log out of disk space)的恢复方法

经常遇到小伙伴在因为环境问题,重启服务器或者集群后,出现 [errcode=-4264] Log out of disk space 报错,导致集群无法拉起。

接下来就是一些处理此类问题的小办法。

问题现象:
observer.log日志报错:
try_recycle_blocks (palf_env_impl.cpp:775)[397][T1_PalfGC][T1][Y0-0000000000000000-0-0] [lt=26][errcode=-4264] Log out of disk space(msg="log disk space is almost full

看报错信息很明确是clog目录满了,还是T1租户,也就是sys租户,修复方式主要是扩大log_disk_size参数。

例如集群资源是这样的:memory_limit=6G,system_memory=1G,datafile_size=5G,log_disk_size=5G,cpu_count=16

正常情况下log_disk_size应该是memory_limit的3~4倍,也就是最低建议值是18G。

这里分3种情况:
1)集群运行过程中clog满了。
2)集群重启失败,报错clog满了。

修复方式:
情况一:
1)先查看集群的总的log_disk_size是否有剩余,关注logdisk_free字段。
select a.zone,concat(a.svr_ip,':',a.svr_port) observer,a.CPU_CAPACITY cpu_total, (CPU_CAPACITY-cpu_assigned) cpu_free, round(a.memory_limit/1024/1024/1024 ) mem_total_gb, round((memory_limit-mem_assigned)/1024/1024/1024) mem_free_gb, round(a.LOG_DISK_CAPACITY/1024/1024/1024) logdisk_total, round((a.LOG_DISK_CAPACITY-a.LOG_DISK_ASSIGNED)/1024/1024/1024) logdisk_free ,round(a.DATA_DISK_CAPACITY/1024/1024/1024) data_total ,round((DATA_DISK_CAPACITY-a.DATA_DISK_IN_USE)/1024/1024/1024) data_free ,b.status,usec_to_time(b.start_service_time) start_service_time, usec_to_time(b.stop_time) stop_time ,b.build_version from GV$OB_SERVERS a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;

2)如果有剩余,先查看sys租户的资源是什么样的
select a.svr_ip,a.svr_port,a.tenant_id,b.tenant_name, CAST(a.data_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) data_disk_use_G, CAST(a.log_disk_size/1024/1024/1024 as DECIMAL(15,2)) log_disk_size_G, CAST(a.log_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) log_disk_use_G from __all_virtual_unit a,dba_ob_tenants b where a.tenant_id=b.tenant_id;

3)修改sys租户log_disk_size
select * from __all_unit_config where name like '%sys%'; #修改sys租户unit配置,建议是sys租户内存的3-4倍大小。 alter resource unit $unit_name log_disk_size '18G';

情况二: 因为集群无法启动,是无法登录数据库修改的,需要使用带参尝试启动方式。

1)带参启动。
注意:不能直接到bin目录下执行 ./bin/observer -o "log_disk_size=18G"
注意:如果报错libmariadb.so.3: cannot open shared object file
修复方式:
#将 OceanBase 数据库的 LIB 加到环境变量 LD_LIBRARY_PATH 中,按实际路径替换下面路径即可。

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase/lib/' >> ~/.bash_profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase/lib/

2)如果尝试启动还是不成功,且剩余磁盘也充足,日志报错如下信息:

可以看出来还是T1租户,日志磁盘不足,used_percent(%)=95,warn_percent(%)=80(log_disk_utilization_threshold),limit_percent(%)=95(log_disk_utilization_limit_threshold),可以知道这个是T1租户clog空间超过95%使用率,应该在80%时候就利用重写,但当前日志还无法回收掉,而达到了停写阀值是95%,因此需要调整停写上限或者重写上限,而且需要集群级别生效的。
尝试设置更高的上限拉起。

./bin/observer -o "log_disk_size=18G,log_disk_utilization_threshold=95"
或者
./bin/observer -o "log_disk_size=18G,log_disk_utilization_limit_threshold=98"
或者
./bin/observer -o "log_disk_size=18G,log_disk_utilization_threshold=95,log_disk_utilization_limit_threshold=98"

3)启动后需要就可以按照情况一的步骤调整sys租户的log_disk_size的大小了,然后还原回log_disk_utilization_threshold(80)或者 log_disk_utilization_limit_threshold(95)参数。
alter system set log_disk_utilization_limit_threshold=95;
alter system set 然后还原回log_disk_utilization_threshold=80;

2 个赞

感谢分享

优秀 :clap: :clap: :clap:

:+1: :+1: :+1: