如何在具有数百万条目的表上有效地更改MySQL表结构?

Cri*_*ero 8 mysql scaling sharding

我有一个MySQL数据库,大小约17 GB,有3800万条目.目前,我需要增加一列的大小(varchar 40到varchar 80)并添加更多列.

许多字段都被编入索引,包括我需要更改的字段.它是应用程序工作所必需的唯一对的一部分.在昨天尝试进行更改时,查询运行了将近四个小时而没有完成,当我决定停止我们的停机并将服务重新启动时.

对这种尺寸的东西进行更改的最有效方法是什么?

其中许多条目也是旧的,如果有一种很好的方法可以对条目进行分类,但仍然可以通过使表格更容易管理来解决这个问题.

O. *_*nes 7

你有一些选择.

在任何情况下,你应该在做这些事情之前备份.

一种可能性是让您的服务脱机并按照您的尝试进行.如果这样做,您应该禁用密钥检查和约束.

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;
Run Code Online (Sandbox Code Playgroud)

这将允许ALTER TABLE操作更快.当您执行ENABLE KEYS时,它将一次性重新生成索引.

另一种可能性是使用您想要的新模式创建一个新表,然后禁用新表上的键,然后按@Bader建议并插入旧表的内容.

构建新表后,您将重新启用其上的键,然后将旧表重命名为"old_bigtable"之类的名称,然后将新表重命名为"bigtable".

在填充新表时,您可以将服务保持在线状态.但这可能效果不佳.

第三种可能性是将您的巨型表(转换为平面文件)转储,然后使用新布局将其加载到新表中.这非常类似于第二种可能性,除了您免费获得表备份.你可以使用SELECT DATA INTO OUTFILE和快速实现这一目标LOAD DATA INFILE.您需要访问服务器计算机的文件系统才能执行此操作.

在所有情况下,禁用,然后重新启用约束和键以使事情变得更快.

  • 在周末有时间处理这个问题之后,这个方法的问题就是innodb不会让你禁用密钥. (2认同)

PyQ*_*yQL 5

使用您想要的新结构创建一个新表,并使用不同的名称,例如 NewTable。

然后使用以下查询将数据从旧表插入到这个新表中:

INSERT INTO NewTable (field1, field2, etc...) SELECT field1, field2, ... FROM OldTable
Run Code Online (Sandbox Code Playgroud)

完成后,您可以删除旧表并将新表重命名为原始名称

DROP TABLE `OldTable`;
RENAME TABLE `NewTable` TO `OldTable` ;
Run Code Online (Sandbox Code Playgroud)

我在一张非常大的桌子上尝试过这种方法,它比改变桌子快得多。


tpo*_*pol 3

在 MySQL 5.1 和 5.5 中,某些 alter 语句得到了增强,只需修改结构而无需重写整个表(http://dev.mysql.com/doc/refman/5.5/en/alter-table.html - 搜索 in -地方)。尽管其可用性因您所做的更改类型和所使用的引擎而异,但最大的价值来自 InnoDB 插件。如果您进行了特定更改,则整个表将被重写。

当我们遇到这些问题时,我们通常会尝试利用副本数据库。只要您添加而不是删除,您就可以首先针对副本运行 DDL,然后安排短暂的中断以将副本提升为主角色。如果您碰巧使用 RDS,这甚至是他们建议的副本实例用途之一http://aws.amazon.com/about-aws/whats-new/2012/10/11/amazon-rds-mysql-rr -晋升/。

其他一些替代方案包括:

  • 选择具有所需结构的记录子集到新表中(用于INTO OUTFILE避免表锁定)。完成后,您可以安排维护时段和REPLACE INTO/或UPDATE自初始数据复制以来原始表中已更改的任何记录。更新完成后,RENAME TABLE...两个表中的一个都会包含更改。
  • 使用 Percona 的 pt-online-schema-change 等工具:http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html。该工具与触发器配合使用,因此如果您想要更改的表上已有触发器,则这可能不符合您的需求。