我需要更改具有 164M 行的 MySQL innodb 表中列的长度。这是我要运行的脚本: ALTER TABLE SESSION_DECISION CHANGE COLUMN NAME NAME VARCHAR(255);
当我尝试运行 alter 查询时,数据库搅动了一个小时并且没有完成任务。访问系统的用户(需要写入表的用户)被锁定。这是一个实时系统,所以我最终通过 ctrl-c'ing 请求让用户访问该站点。
(这是在半夜——使用量很少,但我开始紧张了)。
我在 MySQL 5.0.77 上。
关于如何以最少的停机时间更改色谱柱的任何建议?
您最好的选择是使用 mysql 复制设置从数据库。假设您的架构更改是附加的,那么您可以在该副本上发布更新,这将在更新期间被阻止。完成后,检查您的从属数据库是否赶上了所有更新,然后声明一个小的停机时间以将您的从属数据库提升到主数据库。
您可以在此处找到有关设置mysql 复制的说明。
如果您的数据被严格插入(而不是更新),您可能会执行以下操作:
当然,这需要很长时间。你应该明白,改变列数据类型,你改变了底层数据结构,所以数据必须物理移动,并且可能需要很长时间。我不知道您的硬件容量,但无论哪种方式,都需要一个多小时(想想,一夜之间)。
至于减少停机时间的方法,你不能直接做。我想你没有数据库的备份实例,是吗?
当您提到在 VM 中运行数据库时,我听到很多人感到畏缩。事实上,这取决于虚拟机。如果您不虚拟化硬件,您就不会遭受他们担心的性能损失。通过 Xen 使用半虚拟化(我听说过有关 OpenVZ 的好消息,但没有使用过。)您可以完全按照 Dave Cheney 所说的(这是正确的方法),并且只需要使用一个硬件。
发挥作用的工具/概念将是:
当然,这不是一个完整的指南,而是对您可以以适合您需要的方式研究和实施的技术的合理组合的建议。我的方法更多的是为未来做好准备,戴夫切尼正在处理你(可能)今天拥有的东西。