磁盘占用问题

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】V4.3.5
【问题描述】

数据库使用过程中,有插入过一些数据。但是有一天半夜服务器断电了。启动数据库后把之前任务的目标表进行了truncate table。后续使用数据库,跑一些insert任务的过程中,有些任务会插入数据较大的任务会失败,大概1w条左右的数据插入失败,查看报错信息是(conn=3221677518)Server outof disk space。然后查看磁盘使用情况,发现磁盘占用很高。

express平台上看磁盘使用只有30多G

使用下面语句查询表数据大小,从结果发现整个oceanbase里面的表大小只有30多G,但是在Linux服务器后台/home/ocdb/myoceanbase/oceanbase/store/sstable查看block_file文件大小有585G

select 
   sum(T.data_size_gb)
  ,sum(T.required_size_gb) 
from (
    select
    	/*+ READ_CONSISTENCY(WEAK) */
    	t1.table_name,
    	round(sum(t2.data_size / 1024 / 1024 / 1024), 2) data_size_gb ,
    	round(sum(t2.required_size)/ 1024 / 1024 / 1024, 2) required_size_gb
    from
    	dba_ob_tenants t,
    	cdb_ob_table_locations t1,
    	cdb_ob_tablet_replicas t2
    where
    	t.tenant_id = t1.tenant_id
    	and t1.svr_ip = t2.svr_ip
    	and t1.tenant_id = t2.tenant_id
    	and t1.ls_id = t2.ls_id
    	and t1.tablet_id = t2.tablet_id
    group by
	t1.table_name
) T
;

/home/ocdb/.obd/cluster/myoceanbase/config.yaml相关配置参数为:
datafile_size: 107G system_memory: 6G log_disk_size: 107G datafile_maxsize: 644G datafile_next: 64G

1 个赞

@论坛小助手

1 个赞

根据提供的信息,您的OceanBase数据库出现了磁盘占用过高的问题,这可能与数据盘或CLOG盘空间配置有关。以下是可能导致该问题的原因及解决方案:

  1. 数据盘空间预分配:根据配置 datafile_size: 107Glog_disk_size: 107G,在启动时会预分配相应的磁盘空间。如果实际磁盘空间不足,可能会导致磁盘占用过高。
  2. CLOG盘空间不足:CLOG盘空间配置为 log_disk_size: 107G,如果插入大量数据,CLOG盘可能会迅速占满。建议检查 log_disk_utilization_thresholdlog_disk_utilization_limit_threshold 参数,确保 CLOG 盘有足够的空间。
  3. 数据文件大小:配置 datafile_maxsize: 644Gdatafile_next: 64G,如果数据文件增长过快,可能会导致磁盘占用过高。

解决方式

  1. 检查磁盘空间:确保服务器的磁盘空间足够大,可以考虑增加磁盘空间。
  2. 调整配置参数:根据实际磁盘情况,调整 datafile_sizelog_disk_sizedatafile_maxsize 等参数。
  3. 监控磁盘使用情况:定期监控磁盘使用情况,及时发现并解决问题。
  4. 手动清理:如果确实需要手动清理 CLOG 盘,可以临时调小 log_disk_utilization_threshold,等磁盘空间降下来后,再调整回默认值 80。

示例命令:

ALTER system SET log_disk_utilization_limit_threshold = 98 server = '[IP 地址]:2882';

检索到的文档如下:

  1. BootStrap
  2. oceanbase数据库运行过程中手动删除clog日志
  3. oceanbase clog盘如何瘦身
  4. 4000 ~ 4499
1 个赞

应该是租户的磁盘空间设置的小吧
show parameters where name in (‘memory_limit’,‘memory_limit_percentage’,‘system_memory’,‘log_disk_size’,‘log_disk_percentage’,‘datafile_size’,‘datafile_disk_percentage’);

集群 server 级资源分配情况

select zone,concat(SVR_IP,’:’,SVR_PORT) observer,
cpu_capacity_max cpu_total,cpu_assigned_max cpu_assigned,
cpu_capacity-cpu_assigned_max as cpu_free,
round(memory_limit/1024/1024/1024,2) as memory_total,
round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory,
round(mem_assigned/1024/1024/1024,2) as mem_assigned,
round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free,
round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity,
round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned,
round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free,
round((data_disk_capacity/1024/1024/1024),2) as data_disk,
round((data_disk_in_use/1024/1024/1024),2) as data_disk_used,
round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free
from oceanbase.gv$ob_servers;

集群租户级资源分配和磁盘使用情况

elect a.zone,a.svr_ip,b.tenant_name,b.tenant_type, a.max_cpu, a.min_cpu,
round(a.memory_size/1024/1024/1024,2) memory_size_gb,
round(a.log_disk_size/1024/1024/1024,2) log_disk_size,
round(a.log_disk_in_use/1024/1024/1024,2) log_disk_in_use,
round(a.data_disk_in_use/1024/1024/1024,2) data_disk_in_use
from oceanbase.gv$ob_units a join oceanbase.dba_ob_tenants b on a.tenant_id=b.tenant_id order by b.tenant_name;

1 个赞
zone svr_type svr_ip svr_port name data_type value section scope source edit_level default_value isdefault
zone1 observer x.x.x.96 2882 log_disk_percentage INT 0 LOGSERVICE CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0 1
zone1 observer x.x.x.96 2882 log_disk_size CAPACITY 10G LOGSERVICE CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0M 0
zone1 observer x.x.x.96 2882 memory_limit_percentage INT 80 OBSERVER CLUSTER DEFAULT DYNAMIC_EFFECTIVE 80 1
zone1 observer x.x.x.96 2882 system_memory CAPACITY 6G OBSERVER CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0M 0
zone1 observer x.x.x.96 2882 memory_limit CAPACITY 40G OBSERVER CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0M 0
zone1 observer x.x.x.96 2882 datafile_disk_percentage INT 0 SSTABLE CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0 1
zone1 observer x.x.x.96 2882 datafile_size CAPACITY 650G SSTABLE CLUSTER DEFAULT DYNAMIC_EFFECTIVE 0M 0
zone observer cpu_total cpu_assigned cpu_free memory_total system_memory mem_assigned memory_free log_disk_capacity log_disk_assigned log_disk_free data_disk data_disk_used data_disk_free
zone1 x.x.x.96:2882 18.0 17.0 1.0 40.00 6.00 29.00 5.00 107.00 87.00 20.00 585.00 32.25 552.75
zone svr_ip tenant_name tenant_type max_cpu min_cpu memory_size_gb log_disk_size log_disk_in_use data_disk_in_use
zone1 x.x.x.96 META$1002 META 1.00 1.50 0.76 0.12
zone1 x.x.x.96 META$1004 META 1.00 1.20 0.93 0.11
zone1 x.x.x.96 ocp_meta USER 3.0 3.0 4.00 13.50 4.81 0.15
zone1 x.x.x.96 sys SYS 10.0 10.0 20.00 60.00 4.48 31.52
zone1 x.x.x.96 yvtdb USER 4.0 4.0 3.00 10.80 1.46 0.06

结果如上,看下来感觉空间应该还够

1 个赞

是够的 datafile_size是预占用的 如果你觉得预占用的大 在搭建的时候你可以设置动态扩容 可以看看这个文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003379139

1 个赞

好的,预占用的我们了解了。
但是我们之前还出现过一个现象,就是这之后我们跑插入数据的任务,会出现(conn=3221677518)Server out of disk space错误。这批任务整体大概会插入3000w的数据,每次插入大概1w条。不知道为啥会出现这个错误。
补充一些信息:我们clog和block_file是在一个盘里面;然后现在数据库表占了30G,大概2000W条数据。之前报错的时候,操作系统的这个盘,除开block_file预占用的585G+ clog + 其他的一些文件,整体只剩40多G的空闲空间了。
不知道是不是运行插入任务的时候,由于整体数据量较大,一些日志文件或者其他的文件比较大,导致这个报错。或者说这个报错不知道是指其他磁盘不够了,不是block_file的空间不够了?