Быстрее переносить db из одного приложения heroku в другое
Есть ли более быстрый способ переноса моей производственной базы данных в тестовое приложение?
В настоящее время я делаю heroku db:pull
на моей локальной машине, затем heroku db:push --app testapp
, но это становится трудоемким. У меня есть некоторые данные о семенах, но это не так точно, как просто тестирование с моими реальными данными. И поскольку они оба хранятся на соседнем облаке AWS, должен быть более быстрый способ перемещения данных?
Я думал об использовании пакета heroku, но заметил, что команда animate отсутствует?
bundles:animate <bundle> # animate a bundle into a new app
Ответы
Ответ 1
Это довольно распространено для миграции баз данных между промежуточными, тестовыми и производственными средами для Rails Apps. И heroku db:pull/push
мучительно медленный. Лучший способ, который я нашел до сих пор, заключается в использовании дополнения Heroku PG Backups и бесплатно. Я выполнил следующие шаги для переноса
производственная база данных для промежуточного сервера:
1) Создайте резервную копию для производственного приложения db
heroku pg:backups capture --app production-app
Это приведет к созданию файла резервной копии b001 из основной базы данных (обычно производят db в database.yml)
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
Помните, что восстановление является деструктивной операцией, оно удаляет существующие данные, прежде чем заменять их содержимым файла резервной копии.
Ответ 2
Итак, теперь все проще. Проверьте команду передачи как часть pgbackups
heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi
https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#4b-alternative-transfer-data-between-applications
Это прекрасно сработало для меня, взяв производственный код обратно на мой веб-сайт.
Ответ 3
Правильный ответ снова изменился по состоянию на 11 марта 2015 года.
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
Ответ 4
Обновление для середины 2015 года...
Дополнение pgbackups устарело. Больше pgbackups:transfer
. pg:copy
идеально подходит для этого сценария.
Чтобы скопировать базу данных из yourapp (пример db name: HEROKU_POSTGRESQL_PINK_URL в yourapp_staging (пример db name: 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) для получения констант базы данных.
(источник: https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrade-with-pg-copy-default)
Ответ 5
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
— будет работать в обоих направлениях.
Ответ 6
Не проверял это, но он может работать.
Сделайте это, чтобы получить URL-адрес исходной базы данных:
heroku console "ENV['DATABASE_URL']" --app mysourceapp
Затем попробуйте выполнить db:push
с этим.
heroku db:push database_url_from_before --app mytargetapp
Это может не сработать, если Heroku не разрешает доступ к машинам БД из-за пределов их сети, что, вероятно, так. Вы могли бы, возможно, попробовать использовать краны (драгоценные камни, которые используют команды героя db внутри) из вашего кода приложения где-нибудь (может быть, задача рейка). Это будет даже быстрее, чем вышеупомянутый подход, потому что все остается полностью в пределах AWS.
Edit:
Здесь (по общему признанию, хакерский) способ сделать то, что я описал выше:
Возьмите URL-адрес базы данных, как в первом фрагменте кода выше. Затем из задачи rake (вы можете сделать это на консоли, но вы рискуете запустить 30-секундный тайм-аут на консольных командах), выполните команду оболочки для кранов (нелегко определить, можно ли использовать краны непосредственно из Ruby; docs показывают использование CLI):
`taps pull database_url_from_source_app #{ENV['DATABASE_URL']}`
Обратные шаги важны; это как Ruby обозначает команду оболочки, в которой есть краны. Надеемся, что команда кранов доступна из приложения. Это позволяет избежать проблемы доступа к машине базы данных извне Heroku, поскольку вы используете эту команду из своего приложения.
Ответ 7
Heroku позволяет вам вилку существующих приложений на производстве. Используйте вилку heroku для копирования существующего приложения, включая надстройки, конфигурационные вары и данные Heroku Postgres.
Следуйте инструкциям на Heroku: https://devcenter.heroku.com/articles/fork-app
Ответ 8
Обновление для середины 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