Herokuのpostgresデータベース(9.1)とローカルインストール(8.4)のバージョンの非互換性により、ローカルテスト環境に実稼働データのコピーを配置できるように、プレーンテキストのsqlデータベースダンプファイルが必要です。
Herokuではpg_dumpを使用してダンプを作成することはできませんが、代わりにこれを行うことができます:
$ heroku pgbackups:capture
$ curl -o my_dump_file.dump `heroku pgbackups:url`
...これにより、「プレーンテキスト形式」ではなく「カスタムデータベースダンプ形式」が得られるため、これを行うことはできません。
$ psql -d my_local_database -f my_dump_file.sql
Herokuデータベースから独自のpg_dumpを直接作成できます。
まず、heroku config:get DATABASE_URL
を使用してpostgres文字列を取得します。
Heroku PostgresのURL(例:HEROKU_POSTGRESQL_RED_URL: postgres://user3123:[email protected]:6212/db982398
)を探します。形式はpostgres://<username>:<password>@<Host_name>:<port>/<dbname>
です。
次に、コマンドラインでこれを実行します。
pg_dump --Host=<Host_name> --port=<port> --username=<username> --password --dbname=<dbname> > output.sql
ターミナルはパスワードを要求し、それを実行してoutput.sqlにダンプします。
次にインポートします:
psql -d my_local_database -f output.sql
HerokuのPGBackups 実際に舞台裏でpg_dumpを使用 であり、「カスタム形式」は実際には pg_dumpのカスタム形式(-Fc
パラメーター) であり、Herokuの独自の形式ではありません。
つまり、Postgresの一部であるpg_restore
を使用して、Herokuバックアップを別のデータベースに直接復元できます。
pg_restore -d mydatabase my_dump_file.dump
さらに、 復元するデータベースを指定せずにpg_restore
を呼び出すと、SQLステートメントが標準出力に出力されます ので、HerokuバックアップをそのようにSQLファイルに変換できます。
pg_restore my_dump_file.dump > sql_statements.sql
環境でDATABASE_URL
が構成されていると仮定すると、はるかに簡単な方法があります。
heroku run 'pg_dump $DATABASE_URL' > my_database.sql
これにより、コンテナでpg_dump
が実行され、コンテンツがローカルファイルmy_database.sql
にパイプされます。 一重引用符は重要です。二重引用符を使用する場合(または引用符をまったく使用しない場合)、DATABASE_URL
は、容器。
とにかくコンテンツをローカルデータベースにロードすることが全体の目的である場合は、そこに直接パイプすることもできます。
createdb myapp_devel # start with an empty database
heroku run 'pg_dump -xO $DATABASE_URL' | psql myapp_devel
-xO
を追加すると、GRANT
、REVOKE
、およびALTER OWNER
ステートメントのダンプが回避されます。これらのステートメントは、おそらくローカルデータベースサーバーには適用されません。 COPY
コマンドのいずれかがエラーERROR: literal carriage return found in data
(私のやった)で失敗した場合は、 この回答 を参照してください。
この質問が最初に尋ねられた2年半前には機能しなかった可能性がありますが、Heroku Postgresデータベースのダンプを簡単に取得する方法を探している人にとっては、これが最も簡単な方法のようです今日。