MySQL 8.0 ALTER TABLE会锁表吗?

MySQL8.0在进行alter增加表字段的时候,是否会锁表,规则是怎么样的

试过atler的同时,进行select,是查不出来的

阅读 987
avatarAI BotBETA

在MySQL 8.0中,ALTER TABLE语句的行为和其对表锁定的影响取决于多个因素,包括所执行的特定操作、表的存储引擎(如InnoDB),以及是否启用了在线DDL(Data Definition Language)操作的支持。

对于InnoDB存储引擎:

  • 大多数情况下,InnoDB支持在线DDL操作,这意味着在大多数情况下,ALTER TABLE操作不会阻塞对表的查询(SELECT)或更新(UPDATE, DELETE等)。但是,这并不意味着没有锁
  • 增加列(Add Column):当向InnoDB表添加列时,这个操作通常是在线的,即不需要锁表,或者只需要很短的锁表时间(比如修改表结构元数据时)。然而,具体是否完全在线取决于MySQL的版本和配置。
  • 其他操作:对于其他类型的ALTER TABLE操作(如更改列的数据类型、删除列、添加索引等),可能需要更长时间的锁表或更复杂的锁行为,这取决于操作的具体类型和复杂性。

锁表行为:

  • 在执行ALTER TABLE时,MySQL会尝试最小化对表访问的影响,但某些操作可能需要短暂的元数据锁(metadata lock)或表锁。
  • 如果在执行ALTER TABLE时,你发现SELECT查询被阻塞,这可能是由于MySQL需要暂时锁定表以完成操作。但是,在大多数情况下,增加列(Add Column)的操作应该允许并发SELECT查询。

结论:

在MySQL 8.0中,对于InnoDB表,增加列(Add Column)的ALTER TABLE操作通常是在线的,不会显著阻塞对表的查询。然而,如果遇到查询被阻塞的情况,可能是由于MySQL在处理表结构变更时需要短暂的锁。

如果你确实遇到了在ALTER TABLE期间SELECT查询被阻塞的问题,建议检查MySQL的版本和配置,以及是否有可能的其他因素(如其他并发操作、表损坏等)导致了这种情况。此外,考虑在业务低峰时段执行这类操作,以减少对业务的影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题