最近有个客户在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,解决方法不匹配。
现场反馈的原厂尝试过新建租户方式同样存在问题(备份恢复), 原因是备份恢复仅排除了集群软件问题,配置项会跟随。
- 首先检查集群级限制
如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 —