我的生产环境Rails应用程序在运行rake db:migrate命令时需要167秒的时间,令人沮丧的是,没有任何迁移需要运行。我试图通过检查是否有待处理的迁移来控制迁移运行,但是这个检查所需的时间同样长。唯一的“借口”是我的数据库不小,那里有100万条记录,但我看不出为什么这会有影响。我查看了日志,但没有任何指示出现问题。我的运行环境如下:
- Ruby 2.2.0
- Rails 4.2.0
rake db:migrate
任务还会调用 db:schema:dump
任务,这将更新您的 db/schema.rb 文件。因此,即使您没有迁移,您也会导致其他 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
rake db:migrate
任务在新服务器上非常缓慢,即使没有未完成的迁移。
最终我发现我有一个错误的Redis配置,实际上花费的时间是用于加载Rails环境(rake db:migrate
执行此操作),而不是运行迁移。
如果您遇到类似的问题,建议运行以下命令:
rails runner "puts 'hello'"
rake db:migrate
任务,即使 没有任何待处理的迁移,也需要大约 2 分钟。数据库非常大(100M 记录)。仍在寻找解决方案。 - collimarco