在大型表上运行 ALTER 迁移的建议

问题描述 投票:0回答:2

我们需要向足够大(2 GB)的表中添加一组列。运行仅添加 1 列 (add_column) 的迁移需要 690 秒。现在添加 6 列将锁定表近 1 小时,这是不可取的。

关于如何优雅地完成这件事有什么建议吗? [不能从 MySQL 切换到 Postgres 或任何其他平台。]

mysql ruby-on-rails activerecord database-migration rails-migrations
2个回答
1
投票

SoundCloud 开发了一种名为大型强子迁移器 (LHM) 的 gem,它通过使用复制表来简化这些类型的迁移。

希望能帮到你。


0
投票

现在你可以告诉MySQL在此操作期间不要锁定表,并且还使用INPLACE算法,因此整个操作更快。

class YourMigration < ActiveRecord::Migration[7.0]
  def up
    execute <<-SQL.squish
      ALTER TABLE your_table
      ADD COLUMN investor_id bigint,
      ALGORITHM=INPLACE, LOCK=NONE;
    SQL
  end

  def down
    execute <<-SQL.squish
      ALTER TABLE your_table
      DROP COLUMN investor_id,
      ALGORITHM=INPLACE, LOCK=NONE;
    SQL
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.