在进行版本冻结时操作失败报 4030 错误提示 MEMStore 内存超限。本文介绍该问题的处理方法。
适用版本
OceanBase 数据库 V2.X 的版本
问题现象
在进行版本冻结时操作失败,MEMStore 内存超限,错误信息如下。
obclient> ALTER SYSTEM MAJOR FREEZE; ERROR 4030 (HY000) : Over tenant memory limits
可能原因
当发生冻结操作时,OceanBase 数据库会将未完成的事务迁移到新的 Active MEMStore 中,但如果事务过大,MEMStore 无法承载,则会出现该错误。该错误会导致本机转储超时,进而导致 observer 进程陷入无法恢复的状态,进而停止服务;并且会导致本机无法接收 Leader 节点新同步的日志,从而导致 Leader 停写。
对于事务大小的限制为
memstore_limit_percentage* 租户内存上限 * (1 -freeze_trigger_percentage
),不超过该限制的事务一定可以转储到新的 MEMStore 中,不会导致内存超限。其中,
memstore_limit_percentage
用于设置租户使用 MEMStore 的内存占其总可用内存的百分比,取值范围为
[1,99]
;
freeze_trigger_percentage
用于设置触发全局冻结的租户使用内存阈值,取值范围为
[1,99]
。有关这两个配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统配置项 **章节。
解决方式
要解决由大事务引起的内存超限问题,实质上是减少事务迁移中占用的内存。迁移过程需要的内存尺寸计算方式为
单个事务的尺寸 * 并发事务数
。OceanBase 数据库提供了以下维度控制迁移过程的事务尺寸:
-
减少事务写入量。
-
OceanBase 数据库 V2.2.50 及后续版本引入了隐藏配置项
_max_trx_size
,用于控制单个事务内每个分区最大允许写入的数据大小,默认为 100 MB。如果超过该限制,则会抛出错误
ERROR 6244 (HY000): out of transaction threshold
。有关该配置项的详细信息,请参见 MemStore 内存不足。
-
减少并发事务数。
-
由于冻结的事务在迁移的过程中,需要将所有的未提交事务搬迁到
1 - freeze_trigger
部分,因此可以在业务允许的条件下,根据具体的表结构来评估和调整业务的并发量。
-
提高租户内存规格。
-
OceanBase 数据库的最大事务大小限制为
min{ 租户内存上限 * memstore_limit_percentage * 0.25, max_trx_size}
,如果租户内存规格过小,也会导致迁移内存超限。
-
将 OceanBase 数据库升级到 V3.1.x 或后续版本,OceanBase 数据库 V3.1.X 及后续版本实现了转储未提交事务的功能。