mysql - 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 的功能。
解决方案
为了确保您没有任何锁,您想要的选项是
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
推荐阅读
- javascript - Webpack Dev Build /sockjs-node/XXXXXXXXXXXX/xhr_streaming?t=XXXXXXXX 被多次调用
- c - 用于数组和标量的 Fortran 到 C 接口
- google-cloud-platform - Google Cloud Platform:OAuth 速率限制
- typescript - immutability-helper:我可以 $set 地图中的项目但不能 $merge 它,为什么?我怎样才能 $merge 它?
- android - R8 不支持 applyMapping 吗?
- c# - 无法使用 WCF 上传图像
- php - PHP Mongodb 日期范围
- sql - Oracle SQL Developer:如果出错则停止脚本运行
- c# - 如何在 C# 中使用控制台输入完整的二维矩阵
- java - 如何在java中将两个或多个数字添加到字符串中?