首批通过分布式安全可靠测评,为关键业务系统打造
如何解决 Log out of disk space 问题
更新时间:2024-07-22 03:11
问题现象
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
由报错信息可知 T1 租户(也就是 SYS 租户)的 clog 目录满了,可以通过扩大 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 。
Log out of disk space 的解决方法
情况一:集群运行过程中 clog 满了
先查看集群的总的
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 oceanbase.GV$OB_SERVERS a join oceanbase.__all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;如果有剩余,先查看 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 oceanbase.__all_virtual_unit a,dba_ob_tenants b where a.tenant_id=b.tenant_id;修改 SYS 租户 log_disk_size 。
通过 __all_unit_config 表,查询当前集群中的所有 unit_config 信息。
select * from oceanbase.__all_unit_config where name like '%sys%';修改租户 Unit 配置,命令如下。
## 修改 SYS 租户 Unit 配置,建议是 SYS 租户内存的 3-4 倍大小。 alter resource unit $unit_name log_disk_size '18G';
情况二:集群重启失败,报错 clog 满了
因为集群无法启动,是无法登录数据库进行修改的,需要使用带参数尝试启动。
带参数启动,命令如下。
./bin/observer -o "log_disk_size=18G"注意
不能直接到
bin目录下执行。如果执行带参数启动过程中出现报错
libmariadb.so.3: cannot open shared object file,处理方法如下。## 将 OceanBase 数据库的 library path 加到环境变量 LD_LIBRARY_PATH 中,按实际路径替换下面路径。 echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/' >> ~/.bash_profile export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/如果尝试启动还是不成功,且剩余磁盘也充足,日志报错如下信息。

可以看出来还是 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"启动后需要就可以按照 情况一:集群运行过程中 clog 满了 步骤调整 SYS 租户的
log_disk_size的大小了,然后还原回log_disk_utilization_threshold(80)或者log_disk_utilization_limit_threshold(95)参数。设置租户日志盘利用率限制阈值为 95。
alter system set log_disk_utilization_limit_threshold=95;还原租户日志盘利用率限制阈值为 80。
alter system set log_disk_utilization_threshold=80;