Ruby Rails 5 db迁移:如何修复ActiveRecord::ConcurrentMigrationError

Ruby Rails 5 db迁移:如何修复ActiveRecord::ConcurrentMigrationError,ruby,postgresql,activerecord,ruby-on-rails-5,Ruby,Postgresql,Activerecord,Ruby On Rails 5,前一个rake db:回滚已暂停。现在,在尝试新迁移时,我们会遇到以下错误: 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_

前一个rake db:回滚已暂停。现在,在尝试新迁移时,我们会遇到以下错误:

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)
rake中止!
ActiveRecord::ConcurrentMigrationError:
无法运行迁移,因为另一个迁移进程当前正在运行。
/home/me/.rvm/gems/ruby-2.4。1@global/gems/activerecord-5.1.4/lib/active\u-record/migration.rb:1315:in'with\u-advical\u-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层)in'
/home/me/.rvm/gems/ruby-2.4.1/gems/rake-12.1.0/exe/rake:27:in`'
/home/me/.rvm/gems/ruby-2.4.1/bin/ruby\u可执行文件挂钩:15:in'eval'
/home/me/.rvm/gems/ruby-2.4.1/bin/ruby\u可执行文件挂钩:15:in`'
任务:TOP=>db:migrate
(通过使用--trace运行任务查看完整跟踪)

我们使用的是在Rails 5中添加的Postresql

建议锁定,以防止迁移过程中出现意外并发错误。修复方法是清除留在原地的DB锁

通过对数据库运行以下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
select pg_advisory_unlock({the pid of the lock you want to release})
要清除锁定,请对数据库运行以下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
select pg_advisory_unlock({the pid of the lock you want to release})

如果您使用的是数据库中的数据,而不是表和列设置,那么一次性rake任务可能是更好的选择?

因此在我的例子中,查询是不同的

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
这将基本上告诉您PID

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>

干杯

对我来说,问题是这样解决的:

选择建议锁:

SELECT pid, locktype, mode FROM pg_locks WHERE locktype = 'advisory';
选择pg_terminate_backend();

我也有同样的问题,但对于远程mysql数据库,此数据库没有pg_stat_活动表,您知道在此设置中是否有解决ConcurrentMigrationError的方法吗?mysql人员:ConcurrentMigrationError由添加并使用
获取锁定
(命名锁定)我使用DBeaver清除了我的db锁,但这个答案可以作为解决这种情况的指南。谢谢这应该是选择的答案。谢谢我得到一个
警告:当我用
select pg_advision_unlock(#{target_pid})解锁pid时,您没有类型为ExclusiveLock的锁