[英]Rails Migrations MySQL algorithm: :concurrently alternative
我有这个 Rails 迁移,我正在向一个非常大的表添加一个索引,并且我知道引入一个会锁定表并可能阻止信号量上的构建处理的迁移是非常危险的。 所以我使用了安全路线,而是触发了并发索引构建
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
我正在使用rails 5.2.5
我如何复制功能algorithm: :concurrently
。
为了确保您没有任何锁,您想要的选项是
LOCK=NONE
遗憾的是,我不相信 rails 迁移支持此选项。 一种可能的解决方案是手动构建 SQL 并使用执行运行它。
一个例子可以在下面看到:
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
创建这样的迁移:
add_index(:events, [:status, :created_at], {algorithm: :inplace, lock: :none})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.