即使没有挂起的迁移,Rails迁移也非常慢

时间:2015-12-11 14:38:23

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

我的生产rails应用程序需要167秒才能运行rake db:migrate。 可悲的是,没有要迁移的迁移。我试图通过检查是否存在挂起的迁移来调节迁移,但是检查花了一么长时间。 在我看来,唯一的“借口”是db并不是很小,那里有1M记录,但我认为没有理由说这根本不重要。 我查看了日志,但没有任何迹象表明出现了问题。 我正在运行

  • Ruby 2.2.0
  • Rails 4.2.0

有没有人知道为什么会这样,以及是否有任何关于它的事情?

2 个答案:

答案 0 :(得分:0)

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

您可以查看db:* tasks的源代码(... / 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?

答案 1 :(得分:0)

即使没有正在进行的迁移,rake db:migrate任务在新服务器上也非常慢。

最后,我发现我的Redis配置错误,并且实际上是在加载Rails环境(rake db:migrate完成)和不运行迁移上花费了时间。

如果您遇到类似的问题,建议您运行:

rails runner "puts 'hello'"

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