ALTER TABLE没有锁定表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

在MySQL中执行ALTER TABLE语句时,在整个语句期间整个表都将被读取锁定。如果它是一张大桌子,这意味着插入或更新语句可能会被锁定一段时间。有没有办法做一个“热点改变”,就像添加一个列,使表格在整个过程中仍然可以更新?

大多数情况下,我对MySQL的解决方案感兴趣,但如果MySQL无法完成,我会对其他RDBMS感兴趣。

为了澄清,我的目的仅仅是为了避免需要额外表列的新功能推到生产时的停机时间。任何数据库模式都会随着时间改变,这只是一个事实。我不明白为什么我们应该接受这些改变不可避免地导致停机; 这只是弱。

提问于
用户回答回答于

唯一的其他选择是手动执行许多RDBMS系统的功能...... - 创建一个新表

然后,可以一次将旧表的内容复制到一个块上。同时始终谨慎对待源表上的任何INSERT / UPDATE / DELETE。(可以通过触发器来管理,虽然这会导致速度减慢,但这不是锁定)

完成后,更改源表的名称,然后更改新表的名称。最好在交易中。

完成后,重新编译使用该表的任何存储过程等。执行计划可能不再有效。

有人对这种限制有点评论。所以我想我会用一个新的视角来说明为什么它是这样的......

  • 添加一个新字段就像改变每一行中的一个字段。
  • 现场锁比行锁要困难得多,不必介意表锁。
  • 你实际上正在改变磁盘上的物理结构,每个记录都会移动。
  • 这实际上就像整个表格上的UPDATE,但影响更大......
用户回答回答于

Percona开发了一种称为pt-online-schema-change的工具,可以完成这项工作。

它本质上是复制表格并修改新表格。为了保持新表与原来的同步,它使用触发器来更新。这允许在新的表格在后台准备好时访问原始表格。

这与上面提到的Dems建议的方法类似,但是这是以自动方式进行的。

他们的一些工具有一条学习曲线,即连接到数据库,但一旦有了它,它们就成了很好的工具。

例如:

pt-online-schema-change --alter "ADD COLUMN c1 INT" D=db,t=numbers_are_friends

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励