在线时向大型MySql表添加列

时间:2012-12-02 09:53:20

标签: mysql myisam alter-table large-data

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

在MySQL 5.5(更快的索引创建,innodb),8核CPU,芯片磁盘上,使用多个索引改变5密耳的行表大约需要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而不执行   任何锁定。客户端应用程序可以继   无中断地读写表格。

答案 1 :(得分:2)

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

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