【问题标题】:Rails migration extremely slow even when there are no pending migrations即使没有挂起的迁移,Rails 迁移也非常缓慢
【发布时间】:2016-03-17 12:15:21
【问题描述】:

我的生产 Rails 应用程序需要 167 秒来运行 rake db:migrate。 可悲的是,没有可运行的迁移。我试图在检查是否有待处理的迁移时运行迁移,但随后检查的时间也一样长。 在我看来,唯一的“借口”是数据库并不小,那里有 100 万条记录,但我认为这根本不重要。 我查看了日志,但没有任何迹象表明出现任何问题。 我和

一起跑步
  • Ruby 2.2.0
  • Rails 4.2.0

有没有人知道为什么会这样,是否有什么可做的?

【问题讨论】:

  • 这仅适用于迁移还是一般情况下启动您的应用程序?
  • 嗨最大。只有迁移部分
  • 相同,使用 Rails 5.2.2。仍在寻找解决方案。 mina deploy --version 在迁移部分非常慢
  • 这里有同样的问题(Rails 5.2,Ruby 2.6)。 Capistrano 运行 rake db:migrate 任务,这大约需要 2 分钟,即使 没有任何待处理的迁移。数据库非常大(100M 记录)。仍在寻找解决方案。

标签: ruby-on-rails ruby performance migration rake


【解决方案1】:

运行rake db:migrate 任务也会调用db:schema:dump 任务,这将更新您的db/schema.rb。因此,即使您没有迁移,您也会导致其他 rake 任务运行,这可能会占用该时间,具体取决于您的数据库架构的迁移次数/大小。

您可以查看 db:* 任务的源代码 (.../activerecord/railties/databases.rake)

desc "Migrate the database (options: VERSION=x, VERBOSE=false)."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end

参考:http://guides.rubyonrails.org/active_record_migrations.html#running-migrations

Does rake db:schema:dump recreate schema.rb from migrations or the database itself?

【讨论】:

    【解决方案2】:

    rake db:migrate 任务在新服务器上非常慢,即使没有挂起的迁移也是如此。

    最后我发现我有一个错误的 Redis 配置,时间实际上花在了加载 Rails 环境(rake db:migrate 这样做)而不是运行迁移上。

    如果你有类似的问题,我建议你运行:

    rails runner "puts 'hello'"
    

    如果这需要很长时间,那么问题与 Rails 配置有关,而不是特定于迁移的问题。在这种情况下,您可以在几秒钟后使用 CTRL-C 来终止进程,这样您就可以查看堆栈跟踪并确定您的代码挂起的位置。

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 2010-12-29
      • 1970-01-01
      • 2020-10-13
      • 2015-06-10
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多