磁盘占用高问题如何排查?三步教你搞定

news2025/8/3 2:25:20

作者简介:杨嘉力,OceanBase开源内核高级工程师。

通常情况下,数据库对磁盘的占用量会随着业务的接入时间和业务数据量大增而不断上升,导致磁盘空间不足,进而发生数据无法写入、数据库无法重启等问题。这时我们就需要排查问题根源,使磁盘得以平稳运行。本文以OceanBase 开源3.x版本为例,分享磁盘问题的排查方法,希望对你有所帮助。

排查概括

磁盘问题排查通常包括两方面,一方面,排查磁盘数据 required_size 和实际数据 data size 的大小,如果required_size 比 data size要大很多,那么很可能是多版本问题;另一方面,要排查宏块使用率,如果使用率低,排查是不是宏块重用的问题。
在正式进入排查阶段前,让我们先了解排查过程中涉及的虚拟表和排查指令。
排查过程中涉及的虚拟表和相应的注意事项如下。

  • __all_virtual_meta_table (确认 reqiured_size统计的是不是最后保存在磁盘的数据长度)
  • __all_virtual_table_mgr (查看sstable所占用的空间)
  • __all_virtual_tenant_partition_meta_table(查看租户级的required_size 和 data_size)
  • __all_virtual_sys_variable
  • __all_acquired_snapshot (查看需要的快照表)

涉及的排查指令如下。

  • 查看压缩算法:show parameters like ‘%compress%’;
  • 查看建表语句(确认使用的压缩算法):show create table xxx\G

现在让我们开始排查磁盘占用高的问题。

排查过程三步走

如果你熟悉OceanBase数据库存储架构,那么你会知道,OceanBase的数据文件由多个Memable、多个Minor SSTable及一个(或没有)Major SSTable组成。因此,在排查过程中,我们可以遵循下述的“三步走”策略进行排查。
**第一步,我们要查看某台机器的table_type 大于 0 (所有sstable)的使用情况,**输入指令如下:

select /*+ parallel(30) */ svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1,2 order by 3 desc;

从查询的结果显示(见图1),主要问题是基线(major sstable)占用大,但data_size 和 require size没匹配(见图2),可能还有多个版本。_

_
WechatIMG11.jpeg
图1 查询某台机器table_type 大于 0 的使用情况的结果
 

image.png
图2 data_size 和 require size没匹配

如果你不清楚table_type的所有类型,可以参考以下列表。

enum TableType {
    MEMTABLE = 0,
    MAJOR_SSTABLE = 1,
    MINOR_SSTABLE = 2,  // obsoleted type after 2.2
    TRANS_SSTABLE = 3,  // new table type from 3.1
    MULTI_VERSION_MINOR_SSTABLE = 4,
    COMPLEMENT_MINOR_SSTABLE = 5,            // new table type from 3.1
    MULTI_VERSION_SPARSE_MINOR_SSTABLE = 6,  // reserved table type
    MINI_MINOR_SSTABLE = 7,
    RESERVED_MINOR_SSTABLE = 8,
    MAX_TABLE_TYPE
  };

摸清了问题方向和table_type的所有类型后,我们进入**第二步,排查基线数据major sstable 涉及的版本,**指令如下:

select /*+ parallel(30) */ svr_ip, version, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type = 1 group by 1,2 order by 3 desc;__

__
执行结果(见图3)显示集群中保留了基线的多版本数据,而且有大量的历史版本,导致required size变大,原因可能是多版本保留位点没有推。
 

_
WechatIMG12.jpeg
图3 基线数据major sstable 涉及版本的排查结果
 
此时,我们输入 select * from __all_virtual_sys_variable where name like '%undo_rete%'进行查询,查询结果见图4。

1       undo_retention  2022-06-14 20:50:15.821272  2022-06-14 20:50:15.821272  5  0  specifies (in seconds) the low threshold value of undo retention.  1  0  4294967295
1001    undo_retention  2022-06-14 20:58:07.599412  2022-06-14 20:58:07.599412  5  0  specifies (in seconds) the low threshold value of undo retention.  1  0  4294967295
1002    undo_retention  2022-06-22 18:00:03.182527  2022-06-22 18:00:03.182527  5  0  specifies (in seconds) the low threshold value of undo retention.  1  0  4294967295

image.png
图4 查询多版本保留位点的结果
 
为什么会保留这些版本呢,我们继续找一个svr ip分析,执行 select * from _all_virtual_table_mgr where svr_ip = xxx’ and version = 100 limit 3; 结果(见图5)显示,ip=xxx机器下存在多个索引表,由于索引表的创建需要依赖主表的snapshot_version,会hold住snapshot_version数据。因此我们要查看某个索引表的详细情况。

_
WechatIMG13.jpeg
图5 svr ip分析结果
 
下面继续查询某个index_id下的snapshot_version版本,执行如下命令后得出图6所示结果:

select * from __all_virtual_table_mgr where svr_ip = xxx and index_id = 1101710651081814 and partition_id = 5 order by snapshot_version asc;

WechatIMG14.png
图6 查询某个index_id下的snapshot_version版本所示结果
 
再进一步查询,执行命令为 select * from _all_acquired_snapshot; 得出结果见图7,我们可以看到保留的snapshot快照比较多,因为合并较频繁、叠加建索引时间较久,所以需要保留多版本,故而留下来太多的major版本。

_
image.png
图7 snapshot快照

 
第三步,我们需要排查为什么保留了如此多的snapshot快照。

首先排查建索引历史任务和状态,执行命令:_all_virtual_sys_task_status,结果如图8所示。

_
WechatIMG15.jpeg

图8 排查建索引历史任务和状态

我们从图8中可以得到的信息是,命名为”1101710651081782“的表保留了两个snapshot,由于新建索引对snapshort有依赖,可能导致snapshort一直不被删除,因此我们要排查1101710651081782 table 的 index_status状态,执行命令:select table_id, index_status from __all_virtual_table where data_table_id = 1101710651081782; 结果见图9.
image.png
图9 1101710651081782 table 的 index_status状态
 
需要注意的是,图9中的table_id是指索引表的table_id,data_table_id是指主表的table_id。从此处看index_status=2,表示索引是avaliable的,理论上可以排除建索引失败导致的snapshot保留的问题。
接下来可以查看所有在__all_acquired_snapshot快照表中的table的建索引状态,排查所有在snapshot表中的table是否存在建索引异常,执行命令:select table_id, index_status from __all_virtual_table where data_table_id in (select table_id from __all_acquired_snapshot);得出结果如图10所示。
image.png
图10 所有在snapshot表中的table状态查询结果
我们结合图10中显示的查询结果与index_status的取值(如下),可以排除是新建索引失败导致的snapshot未被删除,进而导致快照点未释放,因此major merge的增多加剧了磁盘空间的占用。

enum ObIndexStatus {
  // this is used in index virtual table:__index_process_info:
  // means the table may be deleted when you get it
  INDEX_STATUS_NOT_FOUND = 0,
  INDEX_STATUS_UNAVAILABLE = 1,
  INDEX_STATUS_AVAILABLE = 2,
  INDEX_STATUS_UNIQUE_CHECKING = 3,    // not used anymore
  INDEX_STATUS_UNIQUE_INELIGIBLE = 4,  // not used anymore
  INDEX_STATUS_INDEX_ERROR = 5,
  INDEX_STATUS_RESTORE_INDEX_ERROR = 6,
  INDEX_STATUS_UNUSABLE = 7,
  INDEX_STATUS_MAX = 8,
};

到此,我们的排查与分析就告一段落了,基本原因已经明确。如何解决呢?
**解决办法很简单,就是将__all_acquired_snapshot表格的记录删掉,使后台任务删除__all_acquired_snapshot的快照即可。**指令为:delete * from __all_acquired_snapshot。
但是,事情并未结束!

OceanBase集群磁盘占用异常排查

当你操作完上述三步,你发现OceanBase集群的磁盘空间占用为207TB,磁盘占用依然处于高位。这显然不符合正常情况,就需要继续定位。
排查统计方法的问题,将OceanBase集群的数据通过导入工具,从MySQL集群中导出,并从information_schema.tables汇总的所有非MySQL原生表的数据量看,数据量正常的情况下存储却膨胀近一倍,从create table 语句中可以明确用户已经开了压缩,在排除数据压缩的问题后,还有一个可能的原因是宏块中存在较多空间未被使用。
我们执行以下命令查看所有宏块的空间使用情况:
select /+ parallel(30) / 2count(1)/1024 as size_g, sum(occupy_size)/1024/1024/1024 as occupy_G from __all_virtual_partition_sstable_macro_info where tenant_id = 1001;
从图11显示的查询结果可见,宏块空间未满,剩余70TB。
image.png
图11 宏块的空间使用情况
 
为什么会存在70TB如此大的宏块磁盘空间未被使用?一般情况下,做一次major merge后,存储系统会将mini sstable、minor sstable与major基线做一次全量合并,合并过程重整宏块以紧凑宏块空间,增大宏块空间利用率。因此,我们可以查询是不是基线major sstable未做合并或合并时未对宏块进行重整,导致了宏块空间使用率低的问题。在此之前,我们还需要排除下面两种mini sstable和minor sstable 宏块多造成磁盘使用高的干扰。
第一,确认有没有转储对宏块使用的影响(排查是否频繁转储生成mini sstable),命令如下:
select /
+ parallel(30) / table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1 order by 2 desc;
排查结果如图12所示,可见磁盘空间主要被major sstable占用。
 
image.png
图12 排查是否频繁转储生成mini sstable的结果
 
第二,确认有没有多个不同版本的major (排查是否有多版本major sstable导致磁盘使用高),命令如下:
select /
+ parallel(30) / version, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type =1 group by 1 order by 2 desc;
排查结果见图13,从中可知,只有一个114版本的major sstable,排除多版本的影响。
 _

*_
image.png
图13 排查是否有多版本major sstable导致磁盘使用高的结果
 
排除了mini sstable和minor sstable 宏块多造成磁盘使用高的干扰后,我们继续排查所有表中data_version=114,tenant_id=1001的sstable 宏块使用情况,命令如下:

select  /*+ parallel(100) */ table_id, count(1), 2*count(1)/1024 as size_g, sum(occupy_size)/1024/1024/1024 as occupy_G from __all_virtual_partition_sstable_macro_info where data_version = 114 and tenant_id = 1001 group by 1 order by 2 desc limit 30;_

_
从排查结果(见图14)中分析,table_id为1100611139454851的宏块空间利用率很低。650/4000,不到1/7。现在我们基本可以确定是宏块空间使用率低导致的数据膨胀。
 _

_
image.png
图14 所有表中data_version=114,tenant_id=1001的sstable 宏块使用情况
 
到此,磁盘空间膨胀(膨胀空间207TB,实际空间是140TB)的原因已经确定是索引宏块没有写满导致的。
 
解决办法是进行数据重整,可以修改参数 : alter table tablename set progressive_merge_num = 1, 然后执行 alter system major freeze,合并结束后,设置 progressive_merge_num = 0(以上操作仅针对磁盘放大的几张索引所在的表)。数据重整后,磁盘空间释放。
 

总结

总的来说,一般需要持久化的数据库系统必然需要占用磁盘空间,而磁盘占用大小取决于用户写入的数据,可以简单理解是一个线性正比关系。另外,出现不符合预期的磁盘占用情况,比如磁盘数据要比实际数据要大得多时,建议先从基础的内部表排查是否存在多版本,包括索引表的依赖版本,最后排除是否宏块利用率低导致的原因,基本就能定位问题并获得解决思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CENTOS上的网络安全工具(十三)搬到Docker上(1)?

鉴于在集群上构建安全工具的情况越来越频繁,并且现在一些安全工具也提供了Docker形式的部署,再停留在虚拟机yum的部署方式似乎已经不太合时宜了。所以在再一次碰到一个安全工具需要使用docker安装的时候,我们毅然(被逼&#xff09…

[附源码]SSM计算机毕业设计中小企业人事管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]Python计算机毕业设计安庆师范大学校园互助平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

C语言学习记录(十二)之字符串和字符串函数

文章目录一、字符串和字符串I/O1.1 定义字符串1.1.1 字符串字面量(字符串常量)1.1.2 字符串数组和初始化1.1.3 数组和指针1.1.4 数组和指针的区别二、字符串输入2.1 分配空间2.2 gets()函数 (不建议使用)2.3 gets()的替代品2.3.1 fgets()函数(和fputs())2.3.2 gets_s()函数2.3.…

【推荐算法毕业设计源码】个性化学习推荐网站的设计及实现丨可定制

登录该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍: 二、文档学习资料: 三、模块截图: 四、开发技术与运行环境: 五、代码展示: 六、数据库表截图&#x…

UE4 GIS Cesium for Unreal插件的使用 教程

效果:(成都郫都区某区域的运行场景) 步骤: 1.到虚幻商城搜索 cesiuml,点击Cesium for Unreal 打开后可以看到目前支持的版本有4.26-4.27和5.0 将其安装到引擎 大概0.2G 2.下载完成后,打开4.26版本的虚幻编…

Study Git - Shell command with Git

前言 这一部分内容主要记录git使用时的重要命令&#xff0c;文章参考&#xff1a; MIT Missing classGit Pro Basic git help \<command>: get help for a git commandgit init: creates a new git repo, with data stored in the .git directorygit status: tells yo…

pytest学习和使用9-fixture中conftest.py如何使用?

9-fixture中conftest.py如何使用&#xff1f;1 引入2 conftest.py简介3 conftest.py特点4 实例4.1 conftest.py4.2 test_conftest1.py4.3 test_conftest2.py5 conftest.py优先级1 引入 之前学习使用fixture前置实现用例的登陆&#xff0c;当时在一个脚本中实现的&#xff1b;那…

基于PHP+MySQL学生创新作品展示系统的设计与实现

MySQL学生创新作品展示系统的基本功能包括用户注册登录,发布作品,查看作品和对评论评论以及在线留言等信息。 PHP本科学生创新作品展示系统是一个服务类型的网站,系统通过PHp&#xff1a;MySQL进行开发,分为前台和后台两部分,前台部分主要是让大学生查看和发布创新作品使用的。…

N3-PEG-MAL,Azdio-PEG-Maleimide,一种点击化学PEG试剂

击化学PEG试剂叠氮-聚乙二醇-马来酰亚胺&#xff0c;该化学试剂其英文名为Azdio-PEG-Maleimide&#xff0c;&#xff08;N3-PEG-MAL&#xff09;。所属分类为&#xff1a;Azide PEG Maleimide PEG。 化学试剂叠氮-PEG-马来酰亚胺的分子量均可定制&#xff0c;有&#xff1a;N3…

音视频开发面试题集锦

下面是 2022.06 月音视频面试题集锦内容的节选&#xff1a; 一、如何根据 NALU 裸流数据来判断其是 H.264 编码还是 H.265 编码&#xff1f; 1&#xff09;通常我们不是根据 NALU 裸流数据中的信息来选择解码器&#xff0c;而是根据媒体封装层的信息来确定解码器。 媒体封装层…

理解TCP协议三次握手、四次挥手、流量控制、拥塞控制 、重传机制

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 计算机网络 &#x1f308; 每日一语&#xff1a;真正的勇气是&…

Mac 常用软件汇总

开发工具 1、Android Studio Android开发工程师对这个玩意是又爱又狠&#xff0c;爱它的灵活自由&#xff0c;恨他的放纵不羁。 2、Sourcetree git 图形化操作工具。 3、IntelliJ IDEA 开发Java项目神器。 4、Serial 串口调试工具。可以打印一些日志信息。 5、Navicat …

Python与pycharm-----windows安装与运行

目录 1.python下载 2.Python安装 3、安装并配置pycharm 1.python下载 上python官网下载。很多计算机自带python&#xff0c;如果不自带的话&#xff0c;需要官网下载。 选好版本&#xff0c;最好为3.7版本的。 2.Python安装 需要记下安装路径&#xff0c;免得后续找不到&am…

【算法系列】非线性最小二乘求解-梯度下降法

系列文章目录 【算法系列】卡尔曼滤波算法 【算法系列】非线性最小二乘求解-直接求解法 【算法系列】非线性最小二乘求解-梯度下降法 【算法系列】非线性最小二乘-高斯牛顿法 文章目录 系列文章 文章目录 前言 一、梯度下降法&#xff08;GD&#xff09; 二、最速下…

深度优先与宽度优先搜索(python)

算法原理 1、宽度优先搜索&#xff1a; 宽度优先搜索算法(Breadth First Search&#xff0c;BSF)&#xff0c;思想是&#xff1a; 从图中某顶点v出发&#xff0c;首先访问顶点v在访问了v之后依次从左往右访问v的各个未曾访问过的邻接点&#xff1b;然后分别从这些邻接点出发依…

loT行业生死竞速:Aqara绿米得用户得天下

作者 | 曾响铃 文 | 响铃说 日前&#xff0c;社科院发布了一份“2022年秋季中国宏观经济形势分析”报告&#xff0c;报告中指出当前&#xff0c;世界经济增长预期下挫&#xff0c;全球通胀居高不下&#xff0c;而中国经济整体仍呈持续恢复状态&#xff0c;但经济内增长动能仍…

【数据结构】树和二叉树以及经典例题

目录1.树的基本概念1.1 树的特点1.2 树的一些相关概念1.3 树的表示1.3.1 那种结构表示树最优&#xff1f;&#xff08;不是二叉树&#xff0c;就是普通的树&#xff09;1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;2. 二叉树&#xff08;重点&#x…

嵌入式linux实现pppoe拨号上网

make menuconfig -> Device Drivers -> Network device support -> PPP (point-to-point protocol) 中&#xff0c;选中所有ppp选项。退出&#xff0c;保存配置&#xff0c;修改Makefile重新执行make zImage. 将arch/mips/boot/下的zImage下载到开发板上重启系统。 t…

oracle数据库的导入与导出

1、oracle数据库导入与导出需要注意 2、导出数据格式介绍 3、 传统方式exp(导出&#xff09;和&#xff08;imp&#xff09;导入 3.1 命令执行方式 3.2 命令格式 3.3 导出数据 3.3.1示例 3.4 导入数据 3.4.1 导入数据 4 使用PL/SQL Developer 实现数据导入与导出 4.1 导出与导…