我需要在MySQL DB(MyISAM表)中的一个表中添加一个新列,其中包含超过2000万行。
添加列的过程必须在运行时,我的意思是应用程序仍在运行,并且在更改表时仍会插入和选择行。
如何安全地执行此过程并且不会损害正在运行的应用程序?
答案 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创建了一个显然适用于所有存储引擎的工具包:
在此版本中,我们推出了新版本 pt-online-schema-change,一个支持的工具 你要改变大表没有阻塞或 停机时间。如您所知,MySQL锁定表 对于大多数ALTER操作,但是pt-online- schema-change执行ALTER而不执行 任何锁定。客户端应用程序可以继 无中断地读写表格。
答案 1 :(得分:2)
在添加新列时,它会锁定表。这意味着任何尝试使用该表的应用程序都将被阻止,直到完成为止。不会对数据造成任何伤害,但尝试使用该表的任何应用程序都将挂起。
很难说它需要多长时间,这取决于数据库已经有多大,因为它必须进行大量数据复制,以及服务器的速度。如上所述,找到这个的方法是复制表并首先对副本执行更改。