[英]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.