OceanBase 4.x的MySQL租户在执行ALTER TABLE添加列和CREATE INDEX时,对生产环境业务表的影响程度如何?是否会导致锁表
看下你的这个操作是online ddl还是offline ddl,如果是online ddl 会锁表,会对业务产生影响
1、 在 OceanBase 4.x 的 MySQL 模式下,创建索引默认支持在线 DDL,不会阻塞 DML 操作,对生产环境影响可控。 OceanBase 实现了 并行创建索引(parallel index build) 技术,创建索引过程中表仍然可读可写。
2、 在 OceanBase 4.x 的 MySQL 模式下,添加列(ALTER TABLE ... ADD COLUMN
)是支持在线 DDL 的,不会长时间锁表,对业务影响较小 。
关于创建索引和添加列是否会锁表的详细解答:
- OceanBase 的锁机制概述
OceanBase 数据库目前不支持表锁,只支持行锁,并且仅存在互斥行锁(参考文档片段 5)。这意味着传统意义上的表级锁定在 OceanBase 中并不存在。
在 OceanBase 数据库中,DDL 操作通过在线 DDL 变更实现,尽量减少对业务的影响。 - 创建普通索引
是否锁表:OceanBase 支持在线 DDL,创建普通索引时不会锁表。与 MySQL 类似,OceanBase 在此过程中会短暂持有元数据锁(MDL),以确保结构一致性。
延迟生效:需要注意的是,OceanBase 创建普通索引是异步执行的,通常 T+1 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。 - 创建唯一索引
是否锁表:创建唯一索引时也不会锁表,但与普通索引类似,唯一索引的创建是异步执行的,通常 T+2 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。
写操作限制:由于唯一性约束的存在,在创建唯一索引的过程中,可能会对写操作(如插入或更新)产生短暂限制,以确保唯一性检查的一致性。 - 添加列
是否锁表:OceanBase 支持在线 DDL,添加列的操作不会锁表。类似于 MySQL 的 Instant DDL 特性,OceanBase 的添加列操作可以几乎瞬时完成,尤其是当新增列允许为 NULL 时。
注意事项:如果新增列设置了默认值,并且该默认值需要回填到现有数据中,则可能会涉及一定的后台扫描和更新操作,但这仍然不会导致表级锁定。 - 总结对比
操作类型 是否锁表(OceanBase 4.x) 备注
创建普通索引 否 异步执行,T+1 生效;短暂持有 MDL。
创建唯一索引 否 异步执行,T+2 生效;可能对写操作有短暂限制。
添加列 否 如果需要回填默认值,可能会涉及后台扫描,但不会锁表。