为什么会出现内存超限,错误码 4030,应该如何解决?

在进行版本冻结时操作失败报 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 数据库提供了以下维度控制迁移过程的事务尺寸:

  1. 减少事务写入量。

  2. OceanBase 数据库 V2.2.50 及后续版本引入了隐藏配置项

    _max_trx_size

    ,用于控制单个事务内每个分区最大允许写入的数据大小,默认为 100 MB。如果超过该限制,则会抛出错误

    ERROR 6244 (HY000): out of transaction threshold

    。有关该配置项的详细信息,请参见 MemStore 内存不足

  3. 减少并发事务数。

  4. 由于冻结的事务在迁移的过程中,需要将所有的未提交事务搬迁到

    1 - freeze_trigger

    部分,因此可以在业务允许的条件下,根据具体的表结构来评估和调整业务的并发量。

  5. 提高租户内存规格。

  6. OceanBase 数据库的最大事务大小限制为

    min{ 租户内存上限 * memstore_limit_percentage * 0.25, max_trx_size}

    ,如果租户内存规格过小,也会导致迁移内存超限。

  7. 将 OceanBase 数据库升级到 V3.1.x 或后续版本,OceanBase 数据库 V3.1.X 及后续版本实现了转储未提交事务的功能。

OB 写测试内存报错建议先看:OB 内存分配概述 (qq.com) 。当租户内存有一定规模情况下(16G),通过参数调优和性能监控,是可以避免内存不足报错。


paxos同步的日志信息也是写入memtable 然后apply吗?