'Rails Migrations MySQL algorithm: :concurrently alternative
I have this rails migration, I'm adding an index to a very large table and am aware of the fact that introducing a migration that would lock the table and potentially block build processing on Semaphore is quite risky. So I used the safe route, and triggered a concurrent index build instead
class AddIndexToEventsTable < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
def change
add_index :events, [:status, :created_at], algorithm: :concurrently
end
end
but after migrating, it turns out to be unsuccessful here's the error:
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Algorithm must be one of the following: :default, :copy, :inplace
Im using rails 5.2.5
How can I replicate the functionality algorithm: :concurrently has with PostGres with MYSQL.
Solution 1:[1]
To make sure you don't have any locks the option you want is
LOCK=NONE
Sadly I do not believe rails migrations have support for this option. One possible solution is to manually build the SQL and run it with execute.
An example can be seen below:
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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Gino |
