当在MySQL中执行ALTER TABLE语句时,整个表在语句期间被锁定(允许并发读取,但禁止并发写入)。如果它是一个大表,则可能会在很长一段时间内阻止INSERT或UPDATE语句。有没有一种方法可以进行“热更改”,例如以在整个过程中仍可更新表的方式添加列?
通常,我对MySQL解决方案感兴趣,但如果MySQL无法做到,我也会对其他RDBMS感兴趣。
要澄清的是,我的目的仅仅是避免在需要额外表列的新功能被投入生产时避免停机。任何数据库架构 都会 随着时间 而 改变,这是事实。我不明白为什么我们应该接受这些变化不可避免地导致停机的原因。那太弱了。
唯一的另一种选择是手动执行许多RDBMS系统要做的…- 创建一个新表
然后,您可以一次复制一个块中的旧表的内容。尽管始终对源表上的任何INSERT / UPDATE / DELETE都保持谨慎。(可以通过触发器进行管理。尽管这会导致速度变慢,但这不是锁…)
完成后,更改源表的名称,然后更改新表的名称。最好是在交易中。
完成后,重新编译使用该表的所有存储过程等。执行计划可能将不再有效。
编辑:
关于此限制有点差的一些评论。所以我想我应该对它放一个新的角度来说明为什么它是如此…
字段锁比行锁要难得多,不用管表锁。
您实际上是在更改磁盘的物理结构,每条记录都会移动。