14

I've run pg:reset on Heroku and on trying to run db:migrate, all migrations run but the migration fails with the following error and trace:

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)>'

As can be seen here the problematic line and the one above it are:

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)

This works locally without any problems, both in development and production environments.

Has anyone experienced anything like this?

4

2 回答 2

50

这是一个有趣的错误,事实证明,可以忽略它。基于它试图做一个 db:structure:dump 的事实,你使用'sql'作为你的 active_record.schema_format。rake 任务 db:structure:dump 将在 heroku 上失败,因为 pg_dump (不出所料)不在二进制路径中。有趣的是,Heroku 声明不支持 db:schema:dump 但如果您将模式格式设置为 ruby​​,它可以正常工作。

在 Rails 3 中,dump 任务只会引发错误,即命令的退出代码为 1。在基于 unix 的系统上,如果找不到该命令,退出代码为 127。所以即使 pg_dump 命令在 rails 3 上失败(它确实),它不会引发错误,也不会停止 rake 任务。所以任何使用 Rails 3 的 sql 模式格式的人都不会遇到这个问题,因为它会默默地失败。Rails 4 中的重构以在转储失败时正确引发错误导致 db:migrate 在 Heroku 上引发错误。然而,即使它与rake abortedddl 的错误实际上是执行和提交的。

可能的解决方案:

  • 在迁移实际运行时忽略该错误。
  • 由于您不关心生产中的结构转储,请将 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
    
于 2013-06-25T19:41:38.940 回答
2

公认的解决方案有些正确。pg_dumpHeroku在其运行时确实有

$ heroku run bash
$ which pg_dump
/usr/bin/pg_dump

问题来自这个问题:https ://github.com/rails/rails/issues/21226命令无法正确运行。

如果你需要做 adb: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

于 2015-08-13T18:18:17.433 回答