SELECT * FROM oceanbase.__all_virtual_disk_stat;
为什么查询出的磁盘使用率比实际数据高很多呢
可以在对应异常的observer的日志目录执行下grep ‘mark and sweep’ observer.log*,看下是否是数据块多了,如果是的话是属于正常的
此外在并发度较高的时候,写入buffer的宏块个数容易大于文件写入并发,出现明显的写入放大情况。建议可以上传写信息导帖子里一起分析下,包括版本、原数据大小、现有数据大小、数据压缩情况等。
可以看下合并状态,有些情况下卡合并和会出现磁盘使用量明显大于数据量的情况
相关操作:可以参考https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000034003
此外根据问题描述可能这个标题改为磁盘利用率低可能更合适。版本型号、所使用的环境麻烦也补充下
版本4.0,现有数据10g左右,磁盘使用率200g。
合并状态是否正常?
可能是临时文件的写入放大,可以用这个语句统计临时文件宏块利用率,文件名需要自行改下
grep ‘ob_tmp_file*’ observer.log.2023031022* | grep ‘succeed to wash a block’ | grep -o ‘free_page_nums:[0-9]*’ | awk -F ‘:’ ‘{ sum += $2; } END { print "total_page_num = " sum; print "avg_free_page_nums = " sum/NR; print "macro_block_count = " NR }’
需要换成有值的log名,observer.log可能还没有刷对应的日志
另外可以看下CDB_OB_TABLET_REPLICA 表中required size和data size的比值
或者可能得分析下数据的情况,方便的话看下能否提供下对应的数据
数据有什么问题呢,数据一共就10g左右,实际显示占用了200g
__all_virtual_disk_stat查的数据和原数据量大小的截图麻烦上传下
CDB_OB_TABLET_REPLICA 表中required size和data size的比值
可以计算出磁盘空洞率
查一下下面 SQL:
WITH table_locs AS (
SELECT
t.tenant_id,
t.database_name,
t.table_id,
t.table_name,
t.table_type tablet_type,
t.tablet_id,
REPLACE(concat(t.table_name,':',t.partition_name,':',t.subpartition_name),':NULL','') tablet_name,
t.tablegroup_name,
t.ls_id,
t.ZONE,
t.ROLE,
t.svr_ip
FROM
oceanbase.CDB_OB_TABLE_LOCATIONS t
WHERE
t.data_table_id IS NULL
UNION
SELECT
i.tenant_id,
i.database_name,
i.table_id,
t.table_name,
i.table_type tablet_type,
i.tablet_id,
REPLACE(
REPLACE(concat(i.table_name,':',i.partition_name,':',i.subpartition_name) ,concat('__idx_', i.data_table_id, '_'),'')
,':NULL',''
) tablet_name,
i.tablegroup_name,
i.ls_id,
i.ZONE,
i.ROLE,
i.svr_ip
FROM
oceanbase.CDB_OB_TABLE_LOCATIONS i
INNER JOIN oceanbase.__all_virtual_table t ON
( i.tenant_id = t.tenant_id
AND i.data_table_id = t.table_id )
WHERE i.data_table_id IS NOT NULL
)
SELECT t.tenant_id,
t.svr_ip,
t.database_name,
round(sum(s.size)/1024/1024/1024,2) size_gb
FROM
table_locs t JOIN oceanbase.GV$OB_SSTABLES s
ON (t.tenant_id=s.tenant_id AND t.ls_id=s.ls_id AND t.svr_ip=s.svr_ip AND t.tablet_id=s.tablet_id)
WHERE 1=1
-- AND t.tenant_id = 1004
-- AND t.database_name IN ('tpccdb')
-- AND t.table_name IN ('bmsql_stock2')
-- AND s.table_type NOT IN ('MEMTABLE')
-- AND t.ROLE IN ('LEADER')
GROUP BY
t.tenant_id,
t.svr_ip,
t.database_name
ORDER BY
t.tenant_id,
t.svr_ip,
t.database_name;