首批通过分布式安全可靠测评,为关键业务系统打造
并发 DDL 和 DML 操作报错 table schema ptr is null (ret=-4016
更新时间:2024-03-04 09:17
本文介绍 OceanBase 数据库在并发 DDL、DML 操作报错 table schema ptr is null(ret=-4016 原因和解决方法。
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
问题现象
OceanBase 数据库在并发 DDL、DML 操作报错 table schema ptr is null(ret=-4016。
问题原因
目前 OceanBase 数据库的 DDL 会在持久化 schema 完成后,向集群发送 RPC,异步地触发机器的 schema 刷新,异步刷新 schema 成功与否不影响用户的 DDL 结果。当 DDL 返回成功时,可能存在部分机器的 schema 仍是落后的情况,当用户请求打到 schema 落后的机器上,语句可能会执行报错。
目前 OceanBase 数据库有机制保证同一 session 上执行的 DDL、DML 大概率满足因果序,但对不同 session 的 DDL 和 DML 则没有任何保证,这导致 DDL 返回成功时,用户后续执行的 DML 行为未决。
解决方法
OceanBase 数据库 V3.2.4.x 新增 _enable_sync_ddl 隐藏配置项,引入 DDL 同步刷新 schema 的能力。
_enable_sync_ddl 介绍
该配置项用于控制 DDL 持久化 schema 成功后,是否触发同步的 schema 刷新。
数据类型:BOOL
取值范围:False、True
默认值:False
生效模式:实时生效
生效是否需要重启:无需重启
级别: 租户级
开启该功能后,DDL 持久化 schema 后需要等其余机器的 schema 刷新结果。该功能有如下副作用:
DDL 执行误报失败。
DDL 执行速度变慢。
使用示例:
开启同步 schema 刷新:
系统租户下执行 alter system set _enable_sync_ddl = 'True' tenant = 'xxxx' ;
普通租户下执行 alter system set _enable_sync_ddl = 'True';。