Rails add_index算法::在迁移过程中同时仍然导致数据库锁定

问题描述:

为了防止在我们迁移到生产站点期间发生数据库事务错误,我们遵循https://github.com/LendingHome/zero_downtime_migrations(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in进行了特别概述)中列出的建议,但是在创建一个特别大的表上的索引,甚至索引创建的“并发”方法都会锁定该表并导致该表上的任何ActiveRecord创建或更新,导致它们各自的事务失败并出现PG::InFailedSqlTransaction异常。Rails add_index算法::在迁移过程中同时仍然导致数据库锁定

这里是迁移是什么样子,我们正在运行的Rails 4.2(通过ActiveRecord 4.2.7.1):

class AddTypeIndexToModel < ActiveRecord::Migration 
    disable_ddl_transaction! 

    def change 
    add_index :model, :model_type_id, algorithm: :concurrently 
    end 
end 
+0

你使用monkeypatch吗?这里如何表示https://github.com/barsoom/devbook/tree/master/deploy_without_downtime –

原来的问题是不相关的,移民,但在跑之前一个在同一个表中添加新列的同一批次。

因为我们在表中添加了一列,所以我们在活动记录https://github.com/rails/rails/issues/12330中触发了这个错误,这实际上导致事务中的所有ActiveRecord操作由于PreparedStatement失效而失败,直到服务器重新启动。

从现在开始,我们将在我们的迁移中使用该问题中描述的解决方法。