2016 年编辑:我们最近(2016 年 8 月)发布了gh-ost
,修改了我的答案以反映它。
今天有几个工具可以让你为 MySQL 做在线修改表。这些是:
让我们考虑“正常”的 `ALTER TABLE`:
一张大桌子要花很长时间ALTER
。innodb_buffer_pool_size
很重要,其他变量也很重要,但在非常大的桌子上它们都可以忽略不计。只是需要时间。
MySQL 对ALTER
表所做的就是创建一个具有新格式的新表,复制所有行,然后切换。在此期间,表完全锁定。
考虑你自己的建议:
它很可能会在所有选项中表现最差。这是为什么?因为您使用的是 InnoDB 表,所以INSERT INTO tablename_tmp SELECT * FROM tablename
会产生事务。一笔巨额交易。它会产生比正常更多的负载ALTER TABLE
。
此外,您必须在那时关闭您的应用程序,以便它不会将 ( INSERT
, DELETE
, UPDATE
) 写入您的表。如果是这样 - 您的整个交易毫无意义。
在线工具提供什么
这些工具并非都一样。但是,基础是共享的:
- 他们用改变的模式创建了一个“影子”表
- 他们创建并使用触发器将更改从原始表传播到幽灵表
- 他们慢慢地将所有行从您的表复制到影子表。他们分块进行:比如说,一次 1,000 行。
- 当您仍然能够访问和操作原始表时,它们会执行上述所有操作。
- 满意后,他们使用
RENAME
.
openark -kit工具已经使用了 3.5 年。Percona 工具已有几个月的历史,但可能比前者经过更多测试。据说 Facebook 的工具适用于 Facebook,但没有为普通用户提供通用解决方案。我自己没用过。
Edit 2016: gh-ost
是一个无触发的解决方案,它显着减少了主控上的主控写入负载,将迁移写入负载与正常负载解耦。它是可审计的、可控的、可测试的。我们在 GitHub 内部开发了它并作为开源发布;我们正在通过gh-ost
今天进行所有生产迁移。在这里查看更多。
每个工具都有其自身的局限性,请仔细查看文档。
保守的方式
保守的方法是使用主动-被动主-主复制,ALTER
在备用(被动)服务器上执行,然后切换角色并ALTER
在以前的主动服务器上再次执行,现在变成被动服务器。这也是一个不错的选择,但需要额外的服务器和更深入的复制知识。