64次更改极限!MySQL DBA如何巧妙规避即时DDL操作的陷阱?
原文来自oralcle 官方blog ,参考 阅读原文。
然后在 MySQL 8.0.29 中,我们增加了在表的任何位置添加(或删除)列的可能性。
有关更多信息,请查看Mayank Prasad的文章:[1],[2]。
在本文中,我想重点讨论使用INSTANT DDL 时可能出现的一些风险。
默认算法
从 MySQL 8.0.12开始,对于任何支持的DDL,默认算法是 INSTANT。这意味着ALTER语句将只修改数据字典中的表元数据。在 DDL 操作的准备和执行阶段不会对表获取独占元数据锁,表数据不受影响,使操作瞬间完成。
另外两种算法是 COPY 和 INPLACE,有关在线DDL操作的详细信息,请参考官方手册。
然而,INSTANT DDL也有一个限制:一个表支持64次即时更改。如果超过64次INSTANT 变更该后的 DDL 需要“重建”表。
如果在ALTER语句(DDL操作)期间没有指定算法(DDL操作),则会默默选择适当的算法。当然,如果没有预期到这一点,在生产环境中可能会导致噩梦般的局面。
始终指定ALGORITHM
因此,第一个建议是在执行 DDL时始终指定算法,即使它是默认的。当指定算法时,如果MySQL无法使用它,它会抛出错误,而不是使用另一种算法执行操作:
ALTER TABLE t1 DROP col1, ALGORITHM=INSTANT;<br>ERROR: 4092 (HY000): Maximum row versions reached for table test/t1.<br>No more columns can be added or dropped instantly. Please use COPY/INPLACE.<br>