OceanBase 4.x mysql租户创建索引、添加列 是否会锁表?

‌MySQL 5.6之前‌,所有ALTER TABLE操作(包括添加索引)默认锁表,期间阻塞所有DML(增删改查)操作。‌‌‌‌‌MySQL 5.6及更高版本‌:InnoDB引擎支持在线DDL,允许在不锁表的前提下创建普通索引,但仍需短暂持有元数据锁(MDL)以保证结构一致性。‌‌MySQL 8.0优化‌新增Instant DDL特性,部分操作(如添加可为空列)几乎瞬时完成,进一步减少锁冲突风险。‌‌
‌InnoDB‌:支持行级锁和在线DDL,普通索引创建通常无需锁表,但添加唯一索引可能短暂限制写操作。

麻烦请教一下:

OceanBase 4.x 版本,比如企业版4.2.1 或者 obcloud 4.2.1, mysql租户创建普通索引、创建唯一索引、添加列 是否会锁表?

3 个赞

@论坛小助手

1 个赞

根据文档库中的信息,针对 OceanBase 4.x 版本(包括企业版 4.2.1 或 obcloud 4.2.1)在 MySQL 租户下的操作行为,以下是关于创建索引和添加列是否会锁表的详细解答:

1. OceanBase 的锁机制概述

  • OceanBase 数据库目前不支持表锁,只支持行锁,并且仅存在互斥行锁(参考文档片段 5)。这意味着传统意义上的表级锁定在 OceanBase 中并不存在。
  • 在 OceanBase 数据库中,DDL 操作通过在线 DDL 变更实现,尽量减少对业务的影响。

2. 创建普通索引

  • 是否锁表:OceanBase 支持在线 DDL,创建普通索引时不会锁表。与 MySQL 类似,OceanBase 在此过程中会短暂持有元数据锁(MDL),以确保结构一致性。
  • 延迟生效:需要注意的是,OceanBase 创建普通索引是异步执行的,通常 T+1 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。

3. 创建唯一索引

  • 是否锁表:创建唯一索引时也不会锁表,但与普通索引类似,唯一索引的创建是异步执行的,通常 T+2 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。
  • 写操作限制:由于唯一性约束的存在,在创建唯一索引的过程中,可能会对写操作(如插入或更新)产生短暂限制,以确保唯一性检查的一致性。

4. 添加列

  • 是否锁表:OceanBase 支持在线 DDL,添加列的操作不会锁表。类似于 MySQL 的 Instant DDL 特性,OceanBase 的添加列操作可以几乎瞬时完成,尤其是当新增列允许为 NULL 时。
  • 注意事项:如果新增列设置了默认值,并且该默认值需要回填到现有数据中,则可能会涉及一定的后台扫描和更新操作,但这仍然不会导致表级锁定。

5. 总结对比

操作类型 是否锁表(OceanBase 4.x) 备注
创建普通索引 异步执行,T+1 生效;短暂持有 MDL。
创建唯一索引 异步执行,T+2 生效;可能对写操作有短暂限制。
添加列 如果需要回填默认值,可能会涉及后台扫描,但不会锁表。

6. 补充说明

  • MySQL 模式下的特殊性:上述行为适用于 OceanBase 的 MySQL 租户模式。对于 Oracle 租户模式,某些行为可能会有所不同,但问题中明确提到的是 MySQL 租户,因此未涉及 Oracle 模式的相关内容。
  • 建议实践:为了避免潜在的性能影响,建议在业务低峰期进行索引创建或列添加操作,并遵循最佳实践(如先新增索引再删除旧索引,参考文档片段 7 的正确代码示例)。

希望以上解答能够解决您的疑问!如果还有其他相关问题,请随时提问。

具体信息可参考以下文档:

  1. 创建表组
  2. 更改表
  3. CREATE INDEX
  4. 使用 MySQL 租户做常见数据库开发
  5. 锁机制
  6. 索引设计
  7. Schema 规范
  8. OceanBase 数据库在 MySQL 模式租户下的扩展功能
  9. LOCK TABLES
1 个赞

:+1: :+1: :+1: :+1: :+1: :+1:

学习

4.3.5,我试了下加个普通索引30秒,,期间CURD都能正常。

1 个赞

好的 感谢!

但是 1 “ *OceanBase 数据库目前不支持表锁,只支持行锁,并且仅存在互斥行锁(参考文档片段 5)。这意味着传统意义上的表级锁定在 OceanBase 中并不存在。”

这句描述是不是不对呀, 3.x只有行锁没有表锁。 4.x 应该支持表锁了吧。

支持表锁,小助手回复的有点问题

1 个赞

霜老师,问下,没有找到像MYSQL那样详细介绍OB的锁工作原理的文档呀,你有吗?

看了OB锁的文档如下总结:

  1. 读数据不上锁,读写不互斥。
  2. 行级锁,写写互斥。
  3. DDL是否会锁
  • online ddl
    • 增删索引,尾部增加列不涉及表级锁,因此不会阻塞 DML。
  • offline ddl
    • 修改列类型、添加主键、删除表等。会导致表级锁,DML 必须等待 DDL 完成后才能继续执行。
  1. 在V3.2版本起引入了主动死锁检测机制(LCL算法),找到优先级最低的事务并终止它,从而打破循环依赖,释放资源。
  2. OB没有Gap Lock, Next-Key Lock概念。

看下这个文档
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016757

这个我看了,上面是我总结的,在锁方面看来就是比MYSQL简洁。