当前位置: 首页 > 知识库问答 >
问题:

后端 - MySQL 8.0 ALTER TABLE会锁表吗?

郝玄天
2024-10-11

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

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

共有1个答案

夹谷硕
2024-10-11

在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的版本和配置,以及是否有可能的其他因素(如其他并发操作、表损坏等)导致了这种情况。此外,考虑在业务低峰时段执行这类操作,以减少对业务的影响。

 类似资料:
  • 问题内容: 帮助客户解决他们遇到的问题。我更多地是sysadmin / DBA的人,所以我在努力帮助他们。他们说这是内核/环境中的错误,在我坚持要在他们的代码中或寻求供应商对OS的支持之前,我试图证明或证明这一点。 发生在Red Hat和Oracle Enterprise Linux 5.7(和5.8)上,应用程序用C ++编写 他们遇到的问题是主线程启动一个单独的线程来执行可能长时间运行的TCP

  • 问题内容: 我有一个复杂的选择查询和一个巨大的表。 我正在运行此语句,同时有一条语句到达并尝试 更新 表。 恕我直言-更新需要 排他 锁-因此update语句将不得不 等待 select命令完成。 我对吗 ? 我该怎么才能做到:执行复杂的, 并且 也让命令运行( 目前我不在乎脏数据 ) 问题答案: 是的-在一定程度上。 多长时间,取决于事务的隔离级别上共享锁认为: -完全不获取共享锁-不被阻止 -

  • 我知道如果我从配置单元提交查询,将获得一个共享锁,然后配置单元表将被查询锁定:https://cwiki.apache.org/confluence/display/Hive/locking

  • 我们有一个系统,我们偶尔会得到一个乐观的锁定异常。我们在代码中已经解决了这个问题,但现在我正在查看JPA 2,并看到它有一个用于处理这个问题的注释(@版本) 我们的问题是,一个表上有多个事务,如果表锁已满,则即使未对相同的记录进行更改,也会导致乐观锁定异常。 我们在JBoss 4.2服务器上使用hibernate,数据库可以是MySQL或SQL服务器。 如果改为使用@Version,这会在两个数据

  • 问题内容: 我想在大约1200万条记录的表上运行以下命令。 我已经在暂存阶段完成了该操作,并且时间安排似乎还不错,但是在生产之前,我想知道在创建新列时锁定表如何工作(特别是在指定默认值的情况下)。那么,有人知道吗?整个表是否被锁定,或者在默认值插入过程中行被一一锁定?还是发生了完全不同的事情? 问题答案: 是的,它将锁定表格。 整个表具有单个架构(列集以及关联的类型)。因此, 至少 需要一个模式锁

  • 审议本届会议: 这是一个在数据库中显示用户图像的图像,带有会话变量!然而,在我的网站中,我正在使用上传图像表单更改用户图片,用户图片正在更新,但旧图片将保留,直到我刷新页面…我希望避免刷新页面以解决此问题。。。。 请注意,我的目标是一个iframe,而不是重定向到我的操作。。。 这是我的上传表格,你可能不需要,但我会把它放在这里... 例如: 使现代化php示例 所以为了简单起见,我想在提交表单时