我在Heroku上运行pg:reset
并尝试运行db:migrate
,所有迁移都会运行,但迁移失败并出现以下错误和跟踪:
rake aborted!
Error dumping database
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/postgresql_database_tasks.rb:55:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/database_tasks.rb:142:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:288:in `block (3 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:51:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:45:in `block (2 levels) in <top (required)>'
可以看出here有问题的行和上面的行是:
command = "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(configuration['database'])}"
raise 'Error dumping database' unless Kernel.system(command)
无论是在开发环境还是生产环境中,这都可以在本地运行。
有没有人经历过这样的事情?
答案 0 :(得分:50)
这是一个有趣的错误,事实证明,它可以被忽略。基于它尝试执行db:structure:dump的事实,您使用'sql'作为active_record.schema_format。 rake任务db:structure:dump将在heroku上失败,因为pg_dump(不出所料)不在二进制路径中。有趣的是,Heroku states不支持db:schema:dump,但如果将架构格式设置为ruby,则可以正常工作。
在Rails 3中,转储任务只会引发一个错误,即命令的退出代码是1.在基于unix的系统上,如果找不到该命令,则退出代码为127.所以即使pg_dump命令失败也是如此rails 3(它确实如此),它不会引发错误,也不会停止rake任务。所以任何使用Rails 3的sql架构格式的人都不会有这个问题,因为它会无声地失败。如果转储失败导致Rails 4中的重构正确引发错误导致db:migrate在Heroku上引发错误。但是,即使错误rake aborted
,ddl实际上已执行并已提交。
可能的解决方案:
由于您不关心生产中的结构转储,因此将schema_format设置为ruby。在config/environments/production.rb
:
config.active_record.schema_format = :ruby
如果由于某种原因您不想更改配置文件:使用以下内容添加rake任务以禁止错误:
if Rails.env == 'production'
Rake::Task["db:structure:dump"].clear
end
答案 1 :(得分:2)
接受的解决方案有点正确。 Heroku的运行时确实有pg_dump
$ heroku run bash
$ which pg_dump
/usr/bin/pg_dump
问题来自此问题:https://github.com/rails/rails/issues/21226命令无法正确运行。
如果您需要执行db:structure load
,则可以使用$ heroku pg:psql
heroku pg:psql -a your-app-name <db/structure.sql
来自heroku rake db:structure:load failure。
如果您需要转储,可以使用本文https://devcenter.heroku.com/articles/heroku-postgres-import-export,还有专门的命令:
$ heroku pg:pull <REMOTE_SOURCE_DATABASE> <TARGET_DATABASE> # pull from REMOTE_SOURCE_DATABASE to TARGET_DATABASE
$ heroku pg:push <SOURCE_DATABASE> <REMOTE_TARGET_DATABASE> # push from SOURCE_DATABASE to REMOTE_TARGET_DATABASE
如果您需要在运行迁移之前重置数据库,可以使用$ heroku pg:reset