本番データベースをテストアプリに転送するより速い方法はありますか?
現在、ローカルマシンに対してheroku db:pull
を実行してから、heroku db:Push --app testapp
を実行していますが、これには時間がかかります。シードデータがいくつかありますが、実際のデータでテストするほど正確ではありません。また、どちらも隣接するAWSクラウドに保存されているため、データを移動するためのより高速な方法が必要ですか?
Herokuバンドルを使用することを考えましたが、animateコマンドがなくなっていることに気付きましたか?
bundles:animate <bundle> # animate a bundle into a new app
Rails Apps。およびheroku db:pull/Push
は非常に遅いため、ステージング、テスト、および本番環境間でデータベースを移行することは非常に一般的です。これまでに見つけた最善の方法は、 Heroku PG Backupsアドオン および 無料 。次の手順に従って、本番データベースをステージングサーバーに移行しました。
1)本番アプリデータベースのバックアップを作成します
heroku pg:backups capture --app production-app
これにより、メインデータベース(通常はdatabase.ymlの本番データベース)からb001バックアップファイルが生成されます。
2)すべてのバックアップを表示するには(オプション)
heroku pg:backups --app production-app
3)pg:backups restoreコマンドを使用して、運用サーバー上の最後のバックアップファイルからステージングサーバーデータベースにデータを入力します。
heroku pg:backups restore $(heroku pg:backups public-url --app production-app) DATABASE_URL --app staging-app
復元は破壊的な操作であることに注意してください。既存のデータを削除してから、バックアップファイルの内容に置き換えます。
そのため、今ではさらに簡単になっています..pgbackupsの一部として転送コマンドをチェックアウトしてください
heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi
これは、プロダクションコードをステージングサイトに戻すのに非常に効果的です。
正解は2015年3月11日をもって再び変更されました。
heroku pg:backups restore $(heroku pg:backups public-url --app myapp-production) DATABASE_URL --app myapp-staging
特に、引数がpublic-url
になっていることに注意してください。
https://blog.heroku.com/archives/2015/3/11/pgbackups-levels-up
2015年半ばの更新...
Pgbackupsアドオンは非推奨になりました。もうpgbackups:transfer
はありません。 pg:copy
はこのシナリオに最適です。
yourappからデータベースをコピーするには(データベース名の例:HEROKU_POSTGRESQL_PINK_URLからyourapp_staging (データベース名の例:HEROKU_POSTGRESQL_WHITE_URL)
# turn off the web dynos in staging
heroku maintenance:on -a yourapp-staging
# if you have non-web-dynos, do them too
heroku ps:scale worker=0 -a yourapp-staging
# backup the staging database if you are paranoid like me (optional)
heroku pg:backups capture -a yourapp-staging
# execute the copy to splat over the top of the staging database
heroku pg:copy yourapp::HEROKU_POSTGRESQL_PINK_URL HEROKU_POSTGRESQL_WHITE_URL -a yourapp-staging
次に、完了したら、ステージングをオンに戻します。
# this is if you have workers, change '1' to whatever
heroku ps:scale worker=1 -a yourapp-staging
heroku maintenance:off -a yourapp-staging
注意:heroku pg:info -a yourapp-staging
(およびyourapp)を使用して、データベース定数を取得できます。
2016年半ばの更新...
Herokuに--fast
フォークを作成するときにフラグを立てますが、最大30時間古くなります。
$ heroku addons:create heroku-postgresql:standard-4 --fork HEROKU_POSTGRESQL_CHARCOAL --fast --app sushi
https://devcenter.heroku.com/articles/heroku-postgres-fork#fork-fast-option
psql -h test_Host -c 'drop database test_db_name; create database test_db_name;'
pg_dump -h production_Host production_db_name | psql -h test_Host test_db_name`
これは、production_Host
またはtest_Host
で実行できます—両方の方法で機能します。
これはテストしていませんが、機能する可能性があります。
これを実行して、ソースデータベースのURLを取得します。
heroku console "ENV['DATABASE_URL']" --app mysourceapp
次に、それを使用してdb:Push
を実行してみてください。
heroku db:Push database_url_from_before --app mytargetapp
Herokuがネットワークの外部からのDBマシンへのアクセスを許可していない場合、これは機能しない可能性があります。これはおそらく事実です。おそらく、アプリコード内のどこか(おそらくrakeタスク)からタップ(heroku dbコマンドが内部で使用するgem)を使用してみることができます。すべてが完全にAWS内にとどまるため、これは上記のアプローチよりもさらに高速になります。
編集:
これが私が上で説明したことをするための(明らかにハッキーな)方法です:
上記の最初のコードスニペットのようにデータベースのURLを取得します。次に、rakeタスクから(コンソールで実行できますが、コンソールコマンドで30秒のタイムアウト制限に達するリスクがあります)、タップに対してシェルコマンドを実行します(Rubyから直接タップを使用できるかどうかを簡単に判断できませんでした。すべてドキュメントはCLIの使用法を示しています):
`taps pull database_url_from_source_app #{ENV['DATABASE_URL']}`
バックティックは重要です。 Rubyは、タップするシェルコマンドを示します。タップコマンドにアプリからアクセスできることを願っています。これにより、実行しているため、Herokuの外部からデータベースマシンにアクセスする問題が回避されます。アプリ内からこのコマンド。
Herokuを使用すると、本番環境で既存のアプリケーションをフォークできます。 heroku forkを使用して、アドオン、構成変数、HerokuPostgresデータなどの既存のアプリケーションをコピーします。
Herokuの指示に従ってください: https://devcenter.heroku.com/articles/fork-app