大部分场景的 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 数据库 升级指南》。