7

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

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

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

我怎样才能安全地完成这个过程而不损害正在运行的应用程序?

4

2 回答 2

5

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

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

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

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

但是,我不能保证这一切都可以在 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 时没有任何锁定。客户端应用程序可以不间断地继续读取和写入表。

于 2012-12-02T10:29:26.977 回答
2

在添加新列时,它将锁定表。这意味着任何尝试使用该表的应用程序都将被阻止,直到它完成。不会对数据造成任何损害,但任何尝试使用该表的应用程序都会挂起。

很难说需要多长时间,这取决于数据库已经有多大,因为它必须进行大量数据复制,以及服务器的速度。正如上面有人所说,找到这个的方法是制作一个表的副本并首先在副本上执行更改。

于 2012-12-02T10:16:05.880 回答