你有一些选择。
在任何情况下,您都应该在执行此操作之前进行备份。
一种可能性是让您的服务脱机并在原地执行,就像您尝试过的那样。如果你这样做,你应该禁用键检查和约束。
ALTER TABLE bigtable DISABLE KEYS;
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE (whatever);
ALTER TABLE (whatever else);
...
SET FOREIGN_KEY_CHECKS=1;
ALTER TABLE bigtable ENABLE KEYS;
这将允许 ALTER TABLE 操作进行得更快。当您执行 ENABLE KEYS 时,它将立即重新生成所有索引。
另一种可能性是使用您想要的新模式创建一个新表,然后禁用新表上的键,然后按照@Bader 的建议执行并插入旧表的内容。
建立新表后,您将重新启用其上的键,然后将旧表重命名为“old_bigtable”之类的名称,然后将新表重命名为“bigtable”。
您可以在填充新表时保持服务在线。但这可能效果不佳。
第三种可能性是将您的巨型表转储(到平面文件),然后将其加载到具有新布局的新表中。这与第二种可能性非常相似,只是您可以免费获得一个表备份。SELECT DATA INTO OUTFILE
你可以用and让这个过程变得非常快LOAD DATA INFILE
。您需要有权访问服务器计算机的文件系统才能执行此操作。
在所有情况下,禁用然后重新启用约束和键以使事情快速进行。