在线时向大型MySql表添加列

Sim*_*onW 6 mysql myisam alter-table large-data

我需要在MySQL DB(MyISAM表)中的一个表中添加一个新列,该表包含超过2000万行.

添加列的过程必须在运行时,我的意思是应用程序仍将运行,并且在更改表时仍将插入和选择行.

  • 这将如何影响正在运行的应用程序?
  • 执行此更改需要多长时间?

如何安全地完成此过程并且不会损害正在运行的应用程序?

Mic*_*eim 5

执行 DDL 查询时表被锁定。这并不意味着服务器在锁定时不接受对其他会话的查询,但它们已排队并可能在您的 ALTER TABLE 完成之前超时。根据硬件、表结构和当然的行数(你说的相当多)等因素,更改将需要一段时间。

在 MySQL 5.5(更快的索引创建,innodb)、8 核 CPU、芯片磁盘上,在我们的案例中,更改具有多个索引的 500 万行表大约需要 15-20 分钟。

我建议创建一个副本,并更改​​副本。完成后,您必须重播数据增量。Facebook 不得不在更高的层次上处理这个问题,看看这个

http://m.facebook.com/note.php?note_id=430801045932

Tho,我不能保证这一切都会在 MyISAM 引擎上安全地工作

编辑:

Percona 创建了一个显然适用于所有存储引擎的工具包:

http://www.mysqlperformanceblog.com/2012/04/05/percona-toolkit-2-1-with-new-online-schema-change-tool/

在此版本中,我们引入了 pt-online-schema-change 的新版本,该工具使您能够在无阻塞或停机的情况下更改大型表。如您所知,MySQL 为大多数 ALTER 操作锁定表,但 pt-online-schema-change 执行 ALTER 时没有任何锁定。客户端应用程序可以不间断地继续读取和写入表。