Есть ли более быстрый способ вытащить данные о производстве из Heroku Than Taps?
Мне часто нужно клонировать данные о производстве, чтобы исследовать ошибки. Даже с тривиальным размером базы данных heroku db: pull (taps) занимает 5+ минут и, похоже, имеет высокую вероятность неудачи. Есть ли альтернативный метод для загрузки базы данных?
Также были бы оценены библиотеки для альтернативных процессов/статей.
Ответы
Ответ 1
Отъезд pgbackups. Он заменил команду пакета Heroku и предоставит вам эквивалент mysqldump postgres. Это гораздо более цивилизован, чем Taps для больших наборов данных.
heroku pgbackups:capture
Создает файл дампа и сохраняет его. Чтобы загрузить файл дампа, вам нужен URL-адрес, который вы получаете с помощью
heroku pgbackups:url b001 (or whatever the id number of the backup is)
Это вернет URL-адрес, с которого вы можете скачать дамп. Вы можете вставить его в Firefox, если хотите, или используйте curl/wget, как они предлагают. Использование pg_restore для загрузки файла дампа в вашу базу данных, как говорится в документах:
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U test_user -d myapp_development /home/mike/Downloads/b001.dump
pg_restore: подключение к базе данных для восстановления
Ответ 2
Я создал оболочку script, которая автоматизирует этот процесс (на основе ответа Майка Уильямсона).
https://gist.github.com/921535
#!/bin/bash
# Best use case is to create a file "update_local_db.sh" in your project folder and then
# call the command with bash update_local_db
# Follow me: @jackkinsella
function LastBackupName () {
heroku pgbackups | tail -n 1 | cut -d"|" -f 1
}
# This part assumes you have a low limit on no. of backups allowed
old_backup=$(LastBackupName)
heroku pgbackups:destroy $old_backup
heroku pgbackups:capture
new_backup=$(LastBackupName)
curl $(heroku pgbackups:url $new_backup) > temporary_backup.dump
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U REPLACE_WITH_YOUR_USER -d REPLACE_WITH_YOUR_DB_NAME temporary_backup.dump
rm -f temporary_backup.dump
Ответ 3
Майк правильно - PGBackups - это способ сделать это. Когда вы создаете резервную копию с помощью PGBackups, вы получаете доступ к стандартным файлам pg_dump. Вот соответствующий раздел статьи Dev Dev PGBackups.
Ответ 4
Эта статья довольно старая прямо сейчас.
Самый новый и простой метод прямо сейчас использует Heroku pg: pull/pg: push
Ответ 5
Обновление Jack script, рекомендация Heroku от Январь 2015 г.
Первая часть связана с запуском на разных компьютерах, поэтому мои сообщения Postgres имеют разные имена.
#!/bin/bash
# Run the following command: bash update_local_db.sh
# Getting computer name, which is the same as username in Postgres db
echo "Please enter name of Computer"
read input_variable
echo "You entered: $input_variable"
# Make a backup on Heroku
heroku pgbackups:capture --app APP_NAME
echo "== Created a new backup =="
# Download the backup and name it latest.dump
curl -o latest.dump `heroku pgbackups:url --app APP_NAME`
echo "== Downloaded the backup =="
# Restore local db with latest.dump
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $input_variable -d my_db_name latest.dump
echo "== Replaced db with downloaded =="
# Delete downloaded db latest.dump
rm -f latest.dump
echo "== Deleted downloaded db =="
echo "== Done! :) =="
Ответ 6
Вот script Я написал, что использует pg:pull
, как упоминал Ломефин, чтобы вытащить db из Heroku и заменить его локальным:
#!/bin/bash
export MAIN_DB=NAME_OF_LOCAL_DB
export TMP_DB=NAME_OF_TEMPORARY_DB
function delete_db () {
psql -d ${1} -c "SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '$1'
AND pid <> pg_backend_pid();" || true
dropdb ${1} || true
}
delete_db ${TMP_DB}
heroku pg:pull DATABASE_URL ${TMP_DB} || exit 1
delete_db ${MAIN_DB}
psql -c "ALTER DATABASE $TMP_DB RENAME TO $MAIN_DB;"
Так как pg:pull
клонирует к новой базе данных, ваша работа не будет прервана (только после того, как она переименует db, что занимает долю секунды). script можно, конечно, легко настроить по своему вкусу.