MemStore 内存不足怎么办?

大部分场景的 MemStore 内存不足是可以自动恢复的,客户端报错后,内存会在一段时间后自动释放。本文介绍需要人工介入的内存不足问题。

适用版本

OceanBase 数据库 V2.X 版本

问题现象

大部分场景的 MemStore 内存不足是可以自动恢复的,客户端报错后,内存会在一段时间后自动释放。本文介绍需要人工介入的内存不足问题。

OceanBase 数据库 V2.X 版本为解决版本冻结会停止正在执行的事务的问题,引入了数据搬迁的机制,即 MemStore 冻结过程中,会确定冻结版本号 Frozen Version,对于事务

commit_version

大于 Frozen Version 的事务,都需要将其写入的数据搬迁到新创建的 Active MemStore上。

假设事务 T1、T2 均有三条日志:Redo_prepare Log、Commit Log、Clear Log。T1 事务的

commit_version

为 100,T2 事务的

commit_version

为 200。T1 和 T2 的 Redo_prepare Log 均回放到了 Memtable A,之后触发冻结,冻结快照版本是 100。显然,事务 T2 的数据需要搬迁到 Active Memtable B 上,如果 T2 较大,搬迁可能出现没有内存,使得搬迁挂起,影响 Memtable A 的内存释放,最终导致本机无法接收 Leader 上新同步的日志,Leader 停写。

规避方式

  • 对于 OceanBase 数据库 V2.X 版本:

  • 控制事务大小,并且控制客户端并发量。

  • 隐藏配置项

    _max_trx_size

    限制了当前事务最大允许写入的事务大小,默认值 100 MB,OceanBase 数据库 V2.X 版本不建议将该配置项的值调大。如果必须要调大,请联系 OceanBase 技术支持。

  • 受该配置项影响,INSERT 最大允许插入的行数为

    _max_trx_zie /(所有插入的列的长度总和 * 2)

    。UPDATE 最大允许更新的行数为

    _max_trx_size /((被更新列长度总和)*4)

  • 例如,假设

    _max_trx_size

    设置为 100 MB,建表语句如下。

obclient> CREATE TABLE test (col1 varchar(512),col2 varchar(512))

  • 则对于该数据表,INSERT 场景允许的行数为

    100,000,000/((512+512)*2)= 50000

    行,UPDATE 场景(假设语句为

    UPDATE test SET col1=, col2=

    ),允许的行数为

    100,000,000/((512+512)*4) = 25000

    行。

  • 对于 OceanBase 数据库其他版本,需要将 OceanBase 数据库升级到 V3.1.0 及以上版本。有关升级 OceanBase 数据库的方法,请参见《OceanBase 数据库 升级指南》。

请问,如果现在ob的memstore已经不足,前端已经报了4030错。那该如何快速恢复哪?(转储?合并?)