基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
在您开始前
更新时间:2026-06-28 08:12:09
如果这是您是第一次接触 OceanBase,那么在开始尝试使用 OceanBase 前,这里有两点 Tips 可以帮助你更好的体验和上手这款分布式数据库。
虽然 OceanBase 在 SQL 语法方面与 MySQL 绝大多数都保持兼容,但是由于底层架构和设计上的差别,一些差异可能会给用户初次使用带来一些困惑。
下面介绍两处最常见的特性差异:
关于内存
OceanBase 使用基于 LSM-Tree 的存储引擎,不同于传统数据库实时刷脏页的机制,OceanBase 将数据分为内存中的 MemTable 和磁盘中的 SSTable,其中所有的数据更新写入操作都在内存的 MemTable 中完成,并且在内存使用量达到一定阈值后触发 compaction,转储至 SSTable,并释放活跃的内存。这种架构的优势是可以将随机 IO 转化为顺序 IO,提供更大的写入吞吐能力。
但是,由于 LSM-Tree 将增量数据都在内存中保存,达到一定阈值后才会触发转储,这使得在小规格的租户实例中运行超过其可承载能力的密集写入场景时,会因为 MemTable 达到上限而无法接受新的请求,这种情况通常发生在数据导入或者运行大量数据批处理场景中。
在 OceanBase 中您可以有多种方式应对这种情况:
开启写入限速
设置内存写入达到一定阈值后, OceanBase 主动限制客户端导入速度。
OceanBase 具备写入过载保护功能,当资源有限,无法扩展内存时,可以设置通过服务端写入限速来保护内存避免写入超限。
writing_throttling_trigger_percentage是租户级参数,是控制写入速度的阈值,即当 MemStore 已使用的内存达到该阈值(百分比)时,触发写入限速。参数的默认值是 100,表示关闭写入限速机制,取值范围为 [0, 100],修改该参数无需重启 OBServer 即刻生效。另一个参数writing_throttling_maximum_duration表示触发限速后,剩余内存最多支持多长时间的写入时间,默认为 2 小时,该项一般不做修改。如果要设置一个租户内存写入达到 80% 开始限速,并保证剩余内存足够提供 1 h 的写入,在租户的管理员账号中做如下设置:
obclient -h127.0.0.1 -P2881 -uroot@test -Doceanbase -p****** ALTER SYSTEM SET writing_throttling_trigger_percentage = 80; ALTER SYSTEM SET writing_throttling_maximum_duration = '1h';扩容租户内存配置
如果您的环境中内存资源相对充足,那么最佳的方案还是增大内存,修改方法详见如下步骤:
登录 OB 集群的 sys 租户管理员账号,执行以下 SQL 语句,确认当前租户使用的 unit_config name。
obclient -h127.0.0.1 -P2881 -uroot@sys -Doceanbase -p****** SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS\G ##其中,sys_unit_config 是管控租户的配置,一般不做修改。本例中使用的租户 test,其 unit_config name 为 test_unit;复制租户的 unit_config name,如本例中的 'test_unit',带入如下命令,完成内存扩容的变更。
ALTER resource unit test_unit max_cpu=2,min_cpu=2, memory_size='10G';
当节点总内存有限,无法扩容时,还可调整租户内存中 MemStore 的比例,扩大可写入内存,并且调低转储阈值,让转储更快发生。
OceanBase 中一个租户的 MemTable 内存的使用量达到配置项
freeze_trigger_percentage所限制使用的百分比时,就会自动触发转储,转储后会释放占用的内存。该参数默认值为 70 ,表示当 MemStore 使用率超过 70%,就会触发转储。另一个相关的参数是memstore_limit_percentage,也就是租户内存中可用于 MemStore 写入的比例,默认为 50%,意为租户使用 MemStore 的内存占其总可用内存 50%。例如一个内存配置为 10 GB 的租户,MemStore 可写入部分为 5 G。该参数的取值范围为 [1, 99],修改该参数无需重启 OBServer 即刻生效。
在内存不足时,可以调大 memstore_limit_percentage 的同时,调低freeze_trigger_percentage,达到临时扩容和尽快转储释放的目的。具体方法如下:
使用 root 用户登录到数据库的 sys 租户:
obclient -h127.0.0.1 -P2881 -uroot@sys -Doceanbase -p****** ALTER SYSTEM SET freeze_trigger_percentage=40; ALTER SYSTEM SET memstore_limit_percentage=70;
关于超时时间
在 OceanBase 中,您可能在查询或执行 DML 操作时遇到 timeout 或 Transaction is timeout 的错误,这是因为不同于 MySQL 默认的机制,OceanBase 中对查询和事务超时做了默认配置,方便用户针对不同业务场景进行调整。 关于超时时间的设置,OceanBase 中有如下三个变量可以调整,您可以直接使用 show variables like '%timeout%' 的命令进行查看:
ob_query_timeout:用于设置 SQL 最大执行时间,单位 us, 默认值为 10s。
ob_trx_timeout:事务超时时间,单位 us,默认值 86400s。
ob_trx_idle_timeout:事务空闲超时时间,单位 us,默认值 86400s。
对于超时时间的设置方法,一般有三种方式:
在会话/全局进行变量设置,例如:
set global ob_query_timeout=xxxxx; //全局级别 set ob_query_timeout=xxxxx; //会话级别在 jdbc 连接串中设置,例如:
jdbc:mysql://xxxxxx.com:3306xxxxxxx&sessionVariables=ob_query_timeout=60000000000,ob_trx_timeout=60000000000&xxxx在 SQL 级别添加 HINT 设置,此种方式只在当前 SQL 有效。
select /*+query_timeout(100000000) */ c1 from t1;
以上就是在您初次使用 OceanBase 时需要额外关注的部分,更多关于开发、运维方面的详细内容,请参考 《开发指南》 和 《运维管理》。