基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
关于集群隐藏参数 _enable_new_sql_nio 的说明
更新时间:2026-05-15 09:06
本文介绍 OceanBase 数据库 V3.2.3 版本中新引入的集群隐藏参数 _enable_new_sql_nio 的功能和作用。
OceanBase 数据库早期版本的 SQL IO 的处理都是基于 libeasy 封装的,后来逐渐发现有两类需求在现有框架下很难实现。
大部分 SQL 请求都是一来一回的,也即一个请求 Request 一个响应 Response,但是也有例外。在 send long data 协议里(COM_STMT_SEND_LONG_DATA),client 会连续多次给 server 发包,并不要求 server 有 response(即在要求 server 有回复之前,client 会给 server 一次性发多个 Request 包)。很自然地协议要求同一个连接上的多个请求要串行执行,否则语义是不定的。现在 easy 解包之后直接丢给 worker 线程池,无法保证多个请求串行执行。
大部分 SQL 请求都很小,但是 send file local 是例外,实际上这个协议本质是流式的,要求 worker 线程处理过程中源源不断读 socket,明显和现在基于 easy 的封装不匹配。因此为了支持 send_long_data 类的协议,开发了串行的网络框架,申请该配置项,来控制串行的 SQL 框架是否开启。OceanBase 数据库 V3.2.3 中默认不开启,走 easy 网络框架,若开启需要设置为 TRUE,并重启生效。
因此,在 OceanBase 数据库 V3.2.3 版本中引入了一个新的 SQL 网络框架控制参数 _enable_new_sql_nio。
obclient [oceanbase]> select * from __all_virtual_sys_parameter_stat where name like '_enable_new_sql_nio'; // specifies whether SQL serial network is turned on. Turned on to support mysql_send_long_dataThe default value is FALSE. Value: TRUE: turned on FALSE: turned off
常用的 SQL:
obclient [oceanbase]> select * from __all_virtual_sys_parameter_stat where name like '_enable_new_sql_nio';
obclient [oceanbase]> alter system set _enable_new_sql_nio=True;
obclient [oceanbase]> alter system set _enable_new_sql_nio=False;
- 参数功能:控制是否开启串行的 SQL 网络框架
- 数据类型:BOOL
- 取值范围:TRUE 或 FALSE
- 默认值:V3.2.3 上是 False,V3.2.4/V4.x 上是 True,OceanBase 数据库 V2.2.77 上则无此参数
- 生效模式:启动时生效
- 生效级别:集群级
- 生效是否需要重启:需要重启
注意事项
OceanBase 数据库 V3.2.3 版本的新网络框架支持还没有很完善,可能触发一些 bug 的风险比较大,因此不建议在 OceanBase 数据库 V3.2.3 上打开该参数。推荐在 V3.2.4 及后续版本使用。
如果使用某些低版本的驱动(如 Go MySQL Driver v1.6.0)来连接 OceanBase 数据库,并插入超过 512KB 的 BLOB 字段,可能会遇到
Error 1235: Not supported feature or function或Error 9747: malformed ps packet报错,建议先升级驱动到最新的版本,如果仍然报错,可以联系 OceanBase 技术支持检查一下_enable_new_sql_nio参数是否设置正确。
适用版本
OceanBase 数据库 V3.2.3 及后续版本