перенести БД из одного приложения герою в другое быстрее - PullRequest
42 голосов
/ 03 октября 2010

Есть ли более быстрый способ перенести мою производственную базу данных в тестовое приложение?

В настоящее время я делаю heroku db:pull на своей локальной машине, а затем heroku db:push --app testapp, но это отнимает много времени.У меня есть некоторые исходные данные, но они не так точны, как простое тестирование с моими реальными данными.И поскольку они оба хранятся в соседнем облаке AWS, должен быть более быстрый способ перемещения данных?

Я думал об использовании пакета heroku, но заметил, что команда animate пропала?

bundles:animate <bundle>     # animate a bundle into a new app 

Ответы [ 8 ]

86 голосов
/ 27 ноября 2011

Для Rails Apps довольно часто происходит миграция баз данных между промежуточной, тестовой и производственной средами.И heroku db:pull/push мучительно медленно.Наилучший способ, который я нашел на данный момент, - это использование дополнения Heroku PG Backups и - бесплатно .Я выполнил следующие шаги для переноса производственной базы данных на промежуточный сервер:

1) Создайте резервную копию для производственного приложения db

heroku pg:backups capture --app production-app

. Это создаст файл резервной копии b001 из основной базы данных (обычнопроизводственная база данных в database.yml)

2) Просмотр всех резервных копий (НЕОБЯЗАТЕЛЬНО)

heroku pg:backups --app production-app

3) Теперь используйте команду восстановления pg: backups для заполнения базы данных промежуточного сервера из последнейфайл резервной копии на рабочем сервере

heroku pg:backups restore $(heroku pg:backups public-url --app production-app) DATABASE_URL --app staging-app

Помните, что восстановление является разрушительной операцией, оно удалит существующие данные перед заменой их содержимым файла резервной копии.

14 голосов
/ 03 июня 2014

Так что теперь все стало еще проще ... извлеките команду переноса как часть 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

Это прекрасно сработало, когда я вернул производственный код обратно в свою стадиюсайт.

11 голосов
/ 03 июня 2015

Правильный ответ снова изменился по состоянию на 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

10 голосов
/ 28 мая 2015

Обновление на середину 2015 года ...

Надстройка pgbackups устарела. Не более pgbackups:transfer. pg:copy идеально подходит для этого сценария.

Чтобы скопировать базу данных из yourapp (пример имени db: HEROKU_POSTGRESQL_PINK_URL в yourapp_staging (пример имени db: 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)

0 голосов
/ 03 сентября 2016

Обновление для середины 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

0 голосов
/ 08 октября 2014

Heroku позволяет раскошелиться на существующие приложения.Используйте вилку heroku для копирования существующего приложения, включая дополнения, конфигурационные файлы и данные Heroku Postgres.

Следуйте инструкциям на Heroku: https://devcenter.heroku.com/articles/fork-app

0 голосов
/ 05 октября 2010

Не проверял это, но это могло бы работать.

Сделайте это, чтобы получить URL вашей исходной базы данных:

heroku console "ENV['DATABASE_URL']" --app mysourceapp

Затем попробуйте выполнить db:push с этим.

heroku db:push database_url_from_before --app mytargetapp

Это может не работать, если Heroku не разрешает доступ к машинам БД из-за пределов их сети, что, вероятно, и так.Вы могли бы, возможно, попробовать использовать tap-ы (гем, который команды heroku db используют внутри) где-то внутри кода вашего приложения (может быть, задача rake).Это было бы даже быстрее, чем описанный выше подход, потому что все остается полностью в AWS.

Редактировать:

Вот (по общему признанию хакерский) способ сделать то, что я описал выше:

Получить URL базы данных, как показано в первом фрагменте кода выше.Затем из задачи rake (вы можете сделать это на консоли, но вы рискуете столкнуться с 30-секундным лимитом времени ожидания для команд консоли), выполните команду оболочки для меток (трудно определить, можно ли использовать метки напрямую из Ruby; вседокументы показывают использование CLI):

`taps pull database_url_from_source_app #{ENV['DATABASE_URL']}`

Обратные знаки важны;Вот как Ruby обозначает команду оболочки, которая называется tap.Надеемся, что команда taps доступна из приложения.Это позволяет избежать проблемы доступа к компьютеру базы данных из-за пределов Heroku, поскольку вы запускаете эту команду из своего приложения.

0 голосов
/ 03 октября 2010
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 - будет работать в обе стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...