首批通过分布式安全可靠测评,为关键业务系统打造
Truncate 后执行 INSERT 发生数据丢失
更新时间:2026-05-28 02:06
适用版本
OceanBase 数据库 V2.x、3.x 版本。
问题现象
业务逻辑中先 Truncate Table,再执行 INSERT,然后 SELECT 查询时发现 INSERT 的数据丢失了。
问题原因
DDL 执行导致的 schema 刷新是异步操作,INSERT 插入到了即将被删除的表上。
DDL 执行完成持久化后,RS 通知各 observer 异步刷新 schema,异步刷新 schema 成功与否不影响用户的 DDL 执行结果。当 DDL 返回成功时,可能存在部分机器的 schema 仍是落后的情况,如果用户请求被发送到 schema 落后的机器上,则可能产生执行报错等各类异常。
目前 OceanBase 数据库在同一 session 上执行的 DDL、DML 和不同 session 的 DDL 和 DML 都无法保证满足因果序,这导致 DDL 返回成功时,用户后续执行的 DML 行为未决。
解决方法
在 V3.2.4 版本,OceanBase 数据库引入 DDL 同步刷新 schema 的能力,保证 DDL 返回成功时,对应租户的可用机器确保刷到最新的 schema。该功能由组户级配置项 _enable_sync_ddl 来控制。
开启同步 schema 刷新。
系统租户下执行。
obclient> alter system set _enable_sync_ddl = 'True' tenant = 'xxxx';普通租户下执行。
obclient> alter system set _enable_sync_ddl = 'True';注意
开启该功能会有如下副作用:
- DDL 持久化 schema 成功后需要同步等机器 schema 刷新的结果,部分机器 schema 刷新失败或者超时会导致 DDL 误报失败。
- 由于 DDL 需要等机器 schema 刷新结果,会导致 DDL 执行速度变慢,特别是在批量导入 DDL 的场景,比如 OMS 结构迁移。
对于 3.2.4 之前的版本,需应用控制 DDL 与 DML 的执行节奏,在 DDL 执行成功后延迟1秒以上再执行 DML。