首页 > 解决方案 > Rails Migrations MySQL 算法::并发替代

问题描述

我有这个 Rails 迁移,我正在向一个非常大的表添加一个索引,并且我知道引入一个会锁定表并可能阻止 Semaphore 上的构建处理的迁移是非常危险的。所以我使用了安全路线,而是触发了并发索引构建

class AddIndexToEventsTable < ActiveRecord::Migration[5.2]
disable_ddl_transaction!

def change
  add_index :events, [:status, :created_at], algorithm: :concurrently
end
end

但是迁移后,结果是不成功,这是错误:

rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Algorithm must be one of the following: :default, :copy, :inplace

我正在使用导轨 5.2.5

如何algorithm: :concurrently使用 MYSQL 复制 PostGres 的功能。

标签: mysqlruby-on-railsindexingmigration

解决方案


为了确保您没有任何锁,您想要的选项是

LOCK=NONE

遗憾的是,我不相信 rails 迁移支持此选项。一种可能的解决方案是手动构建 SQL 并使用 execute 运行它。

一个例子可以在下面看到:

class AddIndexToEventsTable < ActiveRecord::Migration[5.2]
disable_ddl_transaction!

 def change
    execute <<~SQL
      ALTER TABLE events
      ADD INDEX index_events_on_status_created_at(status, created_at),
      ALGORITHM=DEFAULT,
      LOCK=NONE;
    SQL
 end
end

推荐阅读