Rails迁移非常缓慢,即使没有未处理的迁移。

7
我的生产环境Rails应用程序在运行rake db:migrate命令时需要167秒的时间,令人沮丧的是,没有任何迁移需要运行。我试图通过检查是否有待处理的迁移来控制迁移运行,但是这个检查所需的时间同样长。唯一的“借口”是我的数据库不小,那里有100万条记录,但我看不出为什么这会有影响。我查看了日志,但没有任何指示出现问题。我的运行环境如下:
  • Ruby 2.2.0
  • Rails 4.2.0
请问有人知道原因吗?是否有什么解决方法?

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

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

rake db:schema:dump是否从迁移或数据库本身重新创建schema.rb?


0

rake db:migrate任务在新服务器上非常缓慢,即使没有未完成的迁移。

最终我发现我有一个错误的Redis配置,实际上花费的时间是用于加载Rails环境(rake db:migrate执行此操作),而不是运行迁移。

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

rails runner "puts 'hello'"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接