【问题标题】:Rails 5 db migration: how to fix ActiveRecord::ConcurrentMigrationErrorRails 5 db 迁移:如何修复 ActiveRecord::ConcurrentMigrationError
【发布时间】:2018-04-09 03:34:03
【问题描述】:

之前的 rake db:rollback 停止。现在在尝试新迁移时,我们收到以下错误:

rake aborted!
ActiveRecord::ConcurrentMigrationError: 

Cannot run migrations because another migration process is currently running.

/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-    5.1.4/lib/active_record/migration.rb:1315:in `with_advisory_lock'
/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-5.1.4/lib/active_record/migration.rb:1148:in `migrate'
/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-5.1.4/lib/active_record/migration.rb:1007:in `up'
/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-5.1.4/lib/active_record/migration.rb:985:in `migrate'
/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-5.1.4/lib/active_record/tasks/database_tasks.rb:171:in `migrate'
/home/me/.rvm/gems/ruby-2.4.1@global/gems/activerecord-5.1.4/lib/active_record/railties/databases.rake:58:in `block (2 levels) in <top (required)>'
/home/me/.rvm/gems/ruby-2.4.1/gems/rake-12.1.0/exe/rake:27:in `<top (required)>'
/home/me/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in `eval'
/home/me/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

我们正在使用 Postresql

【问题讨论】:

    标签: ruby postgresql activerecord ruby-on-rails-5


    【解决方案1】:

    在 Rails 5 中添加了建议锁定,以防止迁移过程中出现计划外的并发错误。解决方法是清除留在原处的数据库锁。

    通过对您的数据库运行此 SQL 来查看锁:

    SELECT DISTINCT age(now(), query_start) AS age, pg_stat_activity.pid,pg_locks.granted,pg_stat_activity.application_name,pg_stat_activity.backend_start, pg_stat_activity.xact_start, pg_stat_activity.state_change, pg_stat_activity.waiting, pg_stat_activity.state, pg_stat_activity.query_start, left(pg_stat_activity.query, 60)
    FROM pg_stat_activity, pg_locks
    WHERE pg_locks.pid = pg_stat_activity.pid
    

    要清除锁定,请对您的数据库运行此 SQL:

    select pg_advisory_unlock({the pid of the lock you want to release})
    

    【讨论】:

    • 我也有同样的问题,但是远程mysql数据库,这个数据库没有pg_stat_activity表,不知道有没有办法解决这个设置中的ConcurrentMigrationError?
    • MySQL 人:ConcurrentMigrationError 由github.com/rails/rails/pull/22122 添加并使用GET_LOCK(命名锁)
    • 我使用 DBeaver 清除了我的数据库锁,但这个答案可以作为解决问题的指南。谢谢
    • 在我的情况下,持有锁的进程仍在运行,所以 pg_advisory_unlock(pid) 不起作用,相反我可以使用 pg_cancel_backend(pid) 关闭进程,这也清除了锁跨度>
    【解决方案2】:

    对我来说是这样解决的:

    选择咨询锁:

    SELECT pid, locktype, mode FROM pg_locks WHERE locktype = 'advisory';
    
    SELECT pg_terminate_backend(<PID>);
    

    【讨论】:

    • 此解决方案适用于 Heroku,而其他解决方案则不适用。
    【解决方案3】:

    所以在我的情况下,查询是不同的

    SELECT DISTINCT age(now(), query_start) AS age, pg_stat_activity.pid,pg_locks.granted,pg_stat_activity.application_name,pg_stat_activity.backend_start, pg_stat_activity.xact_start, pg_stat_activity.state_change, pg_stat_activity.state, pg_stat_activity.query_start, left(pg_stat_activity.query, 60)
        FROM pg_stat_activity, pg_locks
        WHERE pg_locks.pid = pg_stat_activity.pid
    

    这基本上会告诉你 pids

    0 years 0 mons 0 days 0 hours 0 mins -0.01005 secs    360    true    PostgreSQL JDBC Driver    2019-04-03 16:57:16.873609    2019-04-03 16:58:00.531675    2019-04-03 16:58:00.541727    active    2019-04-03 16:58:00.541725    SELECT DISTINCT age(now(), query_start) AS age, pg_stat_acti
        17272    true    ""                        <insufficient privilege>
        22640    true    ""                        <insufficient privilege>
        29466    true    ""                        <insufficient privilege>
    

    然后您可以使用以下命令简单地解锁 pid: select pg_advisory_unlock(#{target_pid})

    例如:

    select pg_advisory_unlock(17272)
    select pg_advisory_unlock(22640)
    select pg_advisory_unlock(22640)
    select pg_advisory_unlock(360)
    

    干杯!

    【讨论】:

    • 这应该是选择的答案。谢谢!
    • 当我使用 select pg_advisory_unlock(#{target_pid}) 解锁 pid 时,我得到一个 WARNING: you don't own a lock of type ExclusiveLock
    【解决方案4】:

    如果您使用 DB 中的数据,而不是表和列设置,也许一次 rake 任务是一个更好的地方?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2011-04-30
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多