故障诊断: OceanbaseV3 insert失败”-4184: ChunkServer out of disk space”

最近有个客户在Oceanbase数据库上有套多租户环境,其中某一个租主insert values失败,提示ORA-00600 internal error code , arguments: -4184: ChunkServer out of disk space 错误, 版本V3.2.3,在 OceanBase 中遇到错误 -4184: ChunkServer out of disk space 表示集群中的某个或多个 ChunkServer 节点磁盘空间不足,导致无法执行写入操作(如 INSERT),简单记录排查方法。

错误理解

  • ChunkServer:OceanBase 的数据存储节点,负责存储和管理数据块(Chunk)。
  • -4184 错误:表示当前请求写入数据时,目标 ChunkServer 的磁盘使用率已达到或接近上限(由 datafile_size 和 datafile_disk_percentage 控制),无法分配新空间。

注意:oceanbase是预分配的类似bigfile的数据文件,该错误 不一定 意味着操作系统层面的磁盘已满,而是 OceanBase 自身管理的数据文件空间已满。

去年有整理过《Oceanbase 存储空间使用率高统计分析方法》, 这里我们记录另一个情况。

分析思路

全网搜索该报错关键字,只有日志报错 -4184: ChunkServer out of disk space,官方论坛上一篇,这现象是好是坏?不过此篇显示因大SQL查询产生的临时空间,导致空间耗尽,本案例是insert 不会产生temp,解决方法不匹配。

现场反馈的原厂尝试过新建租户方式同样存在问题(备份恢复), 原因是备份恢复仅排除了集群软件问题,配置项会跟随。

  1. 首先检查集群级限制

如log_disk_size, log_disk_percentage, 和datafile_size, datafile_disk_percentage

— 查看数据文件大小配置

SHOW PARAMETERS LIKE 'datafile_size';

SHOW PARAMETERS LIKE 'datafile_disk_percentage';
  • datafile_size:单个数据文件大小(默认 10G)。
  • datafile_disk_percentage:数据文件最多可占用磁盘的百分比(默认 90%)。

如果磁盘总空间为 1TB,datafile_disk_percentage=90%,则 OceanBase 最多使用 900GB。即使磁盘还有空间,只要达到 900GB,就会报 -4184。

如果是该问题导致,解决方案

方案 1:临时扩容数据文件空间

如果磁盘物理空间充足,可以调高 datafile_disk_percentage:

ALTER SYSTEM SET datafile_disk_percentage = 95;

⚠️ 注意:不能超过 95%,否则影响系统稳定性。

方案 2:清理无用数据

  • 删除或归档大表中的历史数据。
查询上限

-- oracle mode
show paramters like 'xxxx'

-- mysql mode as root
obclient(root@sys)[oceanbase]> select zone,svr_ip,name,value,info from oceanbase.__all_virtual_sys_parameter_stat where name like '%datafile%';
+-------+---------------+----------------------------------------+-------+-----------------------------------------------------------------------------------------------------+
| zone  | svr_ip        | name                                   | value | info                                                                                                |
+-------+---------------+----------------------------------------+-------+-----------------------------------------------------------------------------------------------------+
| zone3 | 172.20.22.215 | _datafile_usage_lower_bound_percentage | 10    | the percentage of disk space usage lower bound to trigger datafile shrink. Range: [5,99] in integer |
| zone3 | 172.20.22.215 | _datafile_usage_upper_bound_percentage | 90    | the percentage of disk space usage upper bound to trigger datafile extend. Range: [5,99] in integer |
| zone3 | 172.20.22.215 | datafile_disk_percentage               | 0     | the percentage of disk space used by the data files. Range: [0,99] in integer                       |
| zone3 | 172.20.22.215 | datafile_maxsize                       | 0     | the auto extend max size. Range: [0, +∞)                                                            |
| zone3 | 172.20.22.215 | datafile_next                          | 0     | the auto extend step. Range: [0, +∞)                                                                |
| zone3 | 172.20.22.215 | datafile_size                          | 0M    | size of the data file. Range: [0, +∞)                                                               |
| zone1 | 172.20.22.213 | _datafile_usage_lower_bound_percentage | 10    | the percentage of disk space usage lower bound to trigger datafile shrink. Range: [5,99] in integer |
| zone1 | 172.20.22.213 | _datafile_usage_upper_bound_percentage | 90    | the percentage of disk space usage upper bound to trigger datafile extend. Range: [5,99] in integer |
| zone1 | 172.20.22.213 | datafile_disk_percentage               | 0     | the percentage of disk space used by the data files. Range: [0,99] in integer                       |
| zone1 | 172.20.22.213 | datafile_maxsize                       | 0     | the auto extend max size. Range: [0, +∞)                                                            |
| zone1 | 172.20.22.213 | datafile_next                          | 0     | the auto extend step. Range: [0, +∞)                                                                |
| zone1 | 172.20.22.213 | datafile_size                          | 0M    | size of the data file. Range: [0, +∞)                                                               |
| zone2 | 172.20.22.214 | _datafile_usage_lower_bound_percentage | 10    | the percentage of disk space usage lower bound to trigger datafile shrink. Range: [5,99] in integer |
| zone2 | 172.20.22.214 | _datafile_usage_upper_bound_percentage | 90    | the percentage of disk space usage upper bound to trigger datafile extend. Range: [5,99] in integer |
| zone2 | 172.20.22.214 | datafile_disk_percentage               | 0     | the percentage of disk space used by the data files. Range: [0,99] in integer                       |
| zone2 | 172.20.22.214 | datafile_maxsize                       | 0     | the auto extend max size. Range: [0, +∞)                                                            |
| zone2 | 172.20.22.214 | datafile_next                          | 0     | the auto extend step. Range: [0, +∞)                                                                |
| zone2 | 172.20.22.214 | datafile_size                          | 0M    | size of the data file. Range: [0, +∞)                                                               |
+-------+---------------+----------------------------------------+-------+-----------------------------------------------------------------------------------------------------+
18 rows in set (0.033 sec)

检查参数均一致,同时其他租户正常,说明也不是集群级的参数限制问题。

2. 查询部分ob server耗尽

# Query the disk capacity (total_size) and usage (used_size) of each OBServer in the OceanBase cluster.

SELECT
 svr_ip,
 svr_port,
 ROUND(total_size / 1024 / 1024 / 1024, 2) AS TOTAL_GB,
 ROUND(free_size / 1024 / 1024 / 1024, 2) AS FREE_GB,
 ROUND((total_size - free_size)  / 1024 / 1024 / 1024, 2) AS USED_GB,
 ROUND((total_size - free_size) / total_size * 100, 2) AS USED_PCT
FROM
 oceanbase.__all_virtual_disk_stat order by 1;

也不存在某个server空间使用率高。

3, 统计租户级文件占用

[oceanbase]> select svr_ip,
     round(sum(case when file_type='tenant file data' then data_size else 0 end)/1024/1024) filedata_GB,
     round(sum(case when file_type='tenant file meta data' then data_size else 0 end)/1024/1024) metadata_GB,
     round(sum(case when file_type='tenant index data' then data_size else 0 end)/1024/1024) indexdata_GB,
     round(sum(case when file_type='tenant log data' then data_size else 0 end)/1024/1024) logdata_GB,
     round(sum(case when file_type='tenant tmp data' then data_size else 0 end)/1024/1024) tmpdat_GBa
     from  oceanbase.__all_space_usage
     group by svr_ip;

查询报错租户大小使用300g.

4,检查租户级资源限制配置

tenant_disk_max_size

  • 作用:限制 单个租户(Tenant) 在其所部署的每个 Zone 内可以使用的最大磁盘空间。

默认值:通常为 0,表示无限制(但受 max_disk_size 和物理磁盘限制)。

-- mysql mode
show parameters like 'tenant_disk_max_size';


obclient(root@sys)[oceanbase]> select distinct  table_name from __all_virtual_table where table_name like '%parameter%' order by 1;
+------------------------------------------------+
| table_name                                     |
+------------------------------------------------+
| ALL_VIRTUAL_BACKUP_PARAMETER                   |
| ALL_VIRTUAL_LOG_ARCHIVE_DEST_PARAMETER         |
| ALL_VIRTUAL_SYS_PARAMETER_STAT_AGENT           |
| ALL_VIRTUAL_TENANT_PARAMETER                   |
| ALL_VIRTUAL_TENANT_PARAMETER_STAT              |
| CDB_OB_BACKUP_PARAMETER                        |
| DBA_OB_BACKUP_PARAMETER                        |
| GV$OB_PARAMETERS                               |
| NLS_DATABASE_PARAMETERS                        |
| NLS_INSTANCE_PARAMETERS                        |
| NLS_SESSION_PARAMETERS                         |
| PARAMETERS                                     |
| V$NLS_PARAMETERS                               |
| V$OB_PARAMETERS                                |
| __all_backup_parameter                         |
| __all_backup_parameter_aux_lob_meta            |
| __all_backup_parameter_aux_lob_piece           |
| __all_log_archive_dest_parameter               |
| __all_log_archive_dest_parameter_aux_lob_meta  |
| __all_log_archive_dest_parameter_aux_lob_piece |
| __all_seed_parameter                           |
| __all_seed_parameter_aux_lob_meta              |
| __all_seed_parameter_aux_lob_piece             |
| __all_sys_parameter                            |
| __all_sys_parameter_aux_lob_meta               |
| __all_sys_parameter_aux_lob_piece              |
| __all_virtual_backup_parameter                 |
| __all_virtual_log_archive_dest_parameter       |
| __all_virtual_sys_parameter_stat               |
| __all_virtual_tenant_parameter                 |
| __all_virtual_tenant_parameter_info            |
| __all_virtual_tenant_parameter_stat            |
| __tenant_parameter                             |
| __tenant_parameter_aux_lob_meta                |
| __tenant_parameter_aux_lob_piece               |
+------------------------------------------------+
35 rows in set (0.265 sec)

select * from __all_virtual_tenant_parameter_info where name like 'tenant_disk_max_size';

显示该问题租户确实是tenant_disk_max_size配置上限大小,为307200, 单位应该是MB, 这样更好匹配# 3部分查的大小上限。

租户达到 tenant_disk_max_size

  • 某个租户写入数据,已接近或达到其 tenant_disk_max_size。
  • 即使服务器总空间未满,也无法继续写入。
  • 现象:只有该租户的 INSERT 失败,其他租户正常。

解决方法

确认是曾经安装配置人员,给租户隔离做过资源限制, 而且该限制在OCP中无告警。 解决是调整tenant_disk_max_size为无限值0,或加大当前大小。

— 扩展阅读

相关大小限制的参数

参数作用优先级
datafile_disk_percentage控制 OceanBase 数据文件最多占磁盘的百分比基础限制
max_disk_size控制单个 Server 上 OceanBase 可用的最大空间中层限制(≤ datafile_disk_percentage)
tenant_disk_max_size控制单个租户可用的最大空间上层限制(≤ max_disk_size)

如何查询参数的修改时间?

  • 1、如果我们修改了一个集群的参数,修改后会记录到oceanbase.__all_sys_parameter 系统内部表,可以大概知道集群的参数哪些是非默认的。
  • 2、如果我们修改了一个租户的参数,修改后会记录到oceanbase.__tenant_parameter 系统内部表,可以大概知道租户的参数哪些是非默认的。

— over —

Leave a Comment