OceanBase数据库磁盘空间管理

OceanBase数据库磁盘空间管理

日志盘空间管理

日志盘容量参数

🐯 与日志盘redo_dir相关的四个重要参数:

  • log_disk_size:设置OBServer可以使用的日志盘总空间大小。默认值为0M。该配置项支持动态修改。
  • log_disk_percentage:用于设置Redo日志占用其所在磁盘总空间的百分比。默认值为0。该配置项支持动态修改。
  • log_disk_utilization_threshold:用于设置租户日志盘利用率阈值,当租户日志盘使用量超过租户日志盘空间总量乘以该值时,进行日志文件重用 。默认值为80 ,取值范围为[10,99]。该配置项支持动态修改。
  • log_disk_utilization_limit_threshold:用于设置租户日志盘利用率限制阈值。当租户日志盘使用量超过租户日志盘空间总量乘以该值时,不再允许日志写入 。默认值为95 ,取值范围为[80,100]。该配置项支持动态修改。

log_disk_utilization_limit_threshold的取值应该大于log_disk_utilization_threshold的取值。

🦁 OBServer可以使用的日志盘总容量由集群级别的配置项log_disk_sizelog_disk_percentage共同控制。

  • log_disk_size不为0时,系统按照log_disk_size的值分配日志盘空间;
  • log_disk_size=0log_disk_percentage不为0时,系统按照log_disk_percentage的值分配日志盘空间;
  • log_disk_sizelog_disk_percentage都为0时,系统会根据日志和数据是否共用磁盘来自动计算日志占用的磁盘空间百分比:
    • Redo日志和数据共用磁盘时,日志占用磁盘空间的百分比为30%
    • Redo日志独占磁盘时,日志占用磁盘空间的百分比为90%

检查日志盘相关的配置参数值:

sql 复制代码
obclient(root@sys)[oceanbase]> select zone,tenant_id,scope,section,name,value,edit_level,default_value 
from oceanbase.gv$ob_parameters where name in 
('log_disk_size','log_disk_percentage','log_disk_utilization_limit_threshold','log_disk_utilization_threshold');

+-------+-----------+---------+------------+--------------------------------------+-------+-------------------+---------------+
| zone  | tenant_id | scope   | section    | name                                 | value | edit_level        | default_value |
+-------+-----------+---------+------------+--------------------------------------+-------+-------------------+---------------+
| zone1 |      NULL | CLUSTER | LOGSERVICE | log_disk_percentage                  | 0     | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | LOGSERVICE | log_disk_size                        | 675G  | DYNAMIC_EFFECTIVE | 0M            |
| zone1 |         1 | TENANT  | LOGSERVICE | log_disk_utilization_threshold       | 80    | DYNAMIC_EFFECTIVE | 80            |
| zone1 |         1 | TENANT  | LOGSERVICE | log_disk_utilization_limit_threshold | 95    | DYNAMIC_EFFECTIVE | 95            |
| zone1 |      1001 | TENANT  | LOGSERVICE | log_disk_utilization_threshold       | 80    | DYNAMIC_EFFECTIVE | 80            |
| zone1 |      1001 | TENANT  | LOGSERVICE | log_disk_utilization_limit_threshold | 95    | DYNAMIC_EFFECTIVE | 95            |
| zone1 |      1002 | TENANT  | LOGSERVICE | log_disk_utilization_threshold       | 80    | DYNAMIC_EFFECTIVE | 80            |
| zone1 |      1002 | TENANT  | LOGSERVICE | log_disk_utilization_limit_threshold | 95    | DYNAMIC_EFFECTIVE | 95            |
+-------+-----------+---------+------------+--------------------------------------+-------+-------------------+---------------+
8 rows in set (0.003 sec)

修改日志盘大小:

sql 复制代码
ALTER SYSTEM SET log_disk_size='720G';

修改日志文件占用redo_dir磁盘总空间的百分比:

sql 复制代码
ALTER SYSTEM SET log_disk_percentage=80;

修改特定租户的日志盘利用率阈值:

sql 复制代码
ALTER SYSTEM SET log_disk_utilization_threshold=85 tenant = tpcc; 
ALTER SYSTEM SET log_disk_utilization_limit_threshold=98 tenant = tpcc; 

日志盘空间满应急处理

当遇到clog日志盘空间满的问题时,集群一般表现为无主选举,写入失败,缺副本等现象。应急处理步骤如下:

  1. 主动停止租户的写入,防止clog盘临时腾挪的空间再次快速被业务写入打满,无法修复。

  2. 停止集群写入后,临时调大clog盘阈值比例,由95%调整到98%。

sql 复制代码
ALTER SYSTEM SET log_disk_utilization_limit_threshold = 98 server ='[observer_ip]:2882';
  1. 观察一段时间,一般情况下clog追上后,集群可以自动恢复。

数据盘空间管理

数据盘容量参数

🐯 与数据盘data_dir相关的四个重要参数:

  • datafile_size:用于设置数据文件占用磁盘可用空间的大小。默认值为0M。该配置项支持动态修改,且修改时不支持缩小,只支持扩大
  • datafile_disk_percentage:磁盘数据文件占用磁盘总空间的百分比,默认值为0,取值范围[0,99]。该配置项支持动态修改。
  • datafile_next:用于设置磁盘数据文件自动扩容的步长,默认值为0M,表示不启动增长。该配置项支持动态修改。
  • datafile_maxsize:用于设置磁盘数据文件自动扩容的最大空间,默认值为0M,表示不启动自动扩容。该配置项支持动态修改。

🦁 OBServer可以使用的数据盘总容量由集群级别的配置项datafile_sizedatafile_disk_percentage共同控制。

  • datafile_size不为0时,系统按照datafile_size的值分配数据盘空间;
  • datafile_size=0Mdatafile_disk_percentage不为0时,系统按照datafile_disk_percentage的值分配日志盘空间;
  • datafile_sizedatafile_disk_percentage都为0时,系统会根据日志和数据是否共用磁盘来自动计算日志占用的磁盘空间百分比:
    • 日志和数据共用磁盘时,数据占用磁盘空间的百分比为60%
    • 数据独占磁盘时,数据占用磁盘空间的百分比为90%

🐱 datafile_nextdatafile_maxsize两个参数用于控制数据文件的自动扩展。

  • datafile_next或者datafile_maxsize的值设置为0M时,表示关闭数据文件自动扩展。
  • datafile_maxsize的配置需要大于 当前数据文件占用的磁盘空间大小,即datafile_sizedatafile_disk_percentage对应的数据文件大小,否则不会触发自动扩容。
  • 如果datafile_maxsize超过了磁盘最大空间,则以实际磁盘的可用大小作为最大值。
  • 如果datafile_next的值小于或等于1G 时,实际生效的配置为min(1G, datafile_maxsize * 10%)
  • 如果datafile_next的值大于1G 时,实际生效的配置为min(datafile_next, 磁盘剩余空间)

配置磁盘数据文件的自动扩容功能时,建议将步长datafile_next的初始配置设置为datafile_maxsize20%左右,避免频繁扩容。

检查数据盘相关的配置参数:

sql 复制代码
select zone,tenant_id,scope,section,name,value,edit_level,default_value 
from oceanbase.gv$ob_parameters where name in 
('datafile_size','datafile_disk_percentage','datafile_next','datafile_maxsize');

+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
| zone  | tenant_id | scope   | section | name                     | value | edit_level        | default_value |
+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_disk_percentage | 0     | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_maxsize         | 1024T | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_next            | 2G    | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_size            | 300G  | DYNAMIC_EFFECTIVE | 0M            |
+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
4 rows in set (0.011 sec)

修改数据文件大小:

sql 复制代码
ALTER SYSTEM SET datafile_size='500G';

修改数据文件占用data_dir磁盘总空间的百分比:

sql 复制代码
ALTER SYSTEM SET datafile_disk_percentage=80;

修改数据文件自动扩展配置:

sql 复制代码
alter system set datafile_next = '20G';
alter system set datafile_maxsize = '800G';

数据文件自动扩展

案例:

复制代码
+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
| zone  | tenant_id | scope   | section | name                     | value | edit_level        | default_value |
+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_disk_percentage | 90    | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_maxsize         | 0     | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_next            | 0     | DYNAMIC_EFFECTIVE | 0             |
| zone1 |      NULL | CLUSTER | SSTABLE | datafile_size            | 0M    | DYNAMIC_EFFECTIVE | 0M            |
+-------+-----------+---------+---------+--------------------------+-------+-------------------+---------------+
  1. 检查数据文件参数配置:
sql 复制代码
show parameters like 'datafile_size';
show parameters like 'datafile_disk_percentage';
show parameters like 'datafile_next';
show parameters like 'datafile_maxsize';
  1. 检查当前已经预分配的磁盘空间:
sql 复制代码
MySQL [(none)]> SELECT data_disk_allocated/1024/1024/1024 AS datafile_G FROM oceanbase.GV$OB_SERVERS;
+-------------------+
| datafile_G        |
+-------------------+
| 1842.292968750000 |
+-------------------+
1 row in set (0.004 sec)
  1. datafile_maxsize配置为比data_disk_allocated更大的值,同时设置datafile_next为非零的值。
sql 复制代码
alter system set datafile_maxsize = '2TB';
alter system set datafile_next = '100G';
  1. 确认自动扩容设置是否生效。
sql 复制代码
MySQL [(none)]> SELECT data_disk_allocated/1024/1024/1024 AS datafile_G, data_disk_capacity/1024/1024/1024 AS datafile_max_G FROM oceanbase.GV$OB_SERVERS;
+-------------------+-------------------+
| datafile_G        | datafile_max_G    |
+-------------------+-------------------+
| 1842.292968750000 | 2028.677734375000 |
+-------------------+-------------------+
1 row in set (0.000 sec)

根据查询结果,当前磁盘数据文件自动扩容的最大上限空间data_disk_capacity的值为设置的datafile_maxsize的值,且data_disk_capacity的值大于data_disk_allocated的值,说明自动扩容设置成功。

数据盘空间满应急处理

OceanBase数据盘空间满的情况一般比较少见,但是在写满后也会导致无法转储、无法合并、内存无法释放的问题,进而导致集群无法写入。

处理数据盘空间满的几个策略如下:

  1. 对于分布了多个租户的OB节点,首先考虑通过扩容节点+迁移Unit的方式均衡数据。
  • 扩容节点可以使用OCP页面操作或者使用命令行操作。
  • 使用OCP手动迁移Unit到扩容节点。可以通过双击Unit后的规格进行资源的迁移操作。迁移只能在单个Zone内进行。
  1. 对于暂时无法迁移Unit或通过扩容进行数据均衡的情况,通常采用如下几种方式应急。
  • 调大OceanBase集群磁盘最大空间百分比。该参数默认值为90,应急时调大可以临时释放一部分空间。
sql 复制代码
ALTER system SET datafile_disk_percentage = 98;
  • 删除部分可删除的数据、表、冗余索引等,并清空回收站中的数据。

表占用的磁盘空间

登录用户租户的系统管理员,查看表占用的磁盘空间:

sql 复制代码
--MySQL租户
SELECT * FROM oceanbase.DBA_OB_TABLE_SPACE_USAGE;

--Oracle租户
SELECT * FROM sys.DBA_OB_TABLE_SPACE_USAGE;

返回结果中:

  • OCCUPY_SIZE:表压缩后落盘的数据量,单位为字节。
  • REQUIRED_SIZE:表压缩后落盘的数据量实际占用了多少磁盘空间,单位为字节。
    从返回结果中,还可以通过(OCCUPY_SIZE / REQUIRED_SIZE) * 100%来计算磁盘空间的利用率。
相关推荐
lqlj22331 分钟前
如何在idea中写spark程序
java·spark·intellij-idea
Kiri霧10 分钟前
Java 多线程基础:Thread 类详解
java·开发语言
冼紫菜15 分钟前
探索微服务入口:Spring Cloud Gateway 实战指南
java·开发语言·后端·spring cloud·微服务·gateway
极小狐17 分钟前
如何创建极狐GitLab 私密议题?
数据库·ci/cd·gitlab·devops·mcp
Seven9720 分钟前
缓存穿透的解决方式?—布隆过滤器
java·数据结构·redis
qq_1629115923 分钟前
tigase源码学习杂记-IO处理的线程模型
java·学习·源码·xmpp·tigase·多线程io模型
麻芝汤圆38 分钟前
在 IDEA 中写 Spark 程序:从入门到实践
java·大数据·hadoop·分布式·安全·spark·intellij-idea
像风一样自由202041 分钟前
PySide与PyQt对比:为何PySide是更优选择
数据库·系统架构·pyqt
HashData酷克数据1 小时前
回顾|Apache Cloudberry™ (Incubating) Meetup·2025 杭州站
数据库
LUCIAZZZ1 小时前
分布式链路追踪理论
java·分布式·中间件·操作系统·链路追踪