簡體   English   中英

Rails Migrations MySQL 算法::並發替代

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM