我们需要向足够大(2 GB)的表中添加一组列。运行仅添加 1 列 (add_column) 的迁移需要 690 秒。现在添加 6 列将锁定表近 1 小时,这是不可取的。
关于如何优雅地完成这件事有什么建议吗? [不能从 MySQL 切换到 Postgres 或任何其他平台。]
SoundCloud 开发了一种名为大型强子迁移器 (LHM) 的 gem,它通过使用复制表来简化这些类型的迁移。
希望能帮到你。
现在你可以告诉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