Существует ли более быстрый способ получения производственных данных из Heroku Than Taps? - PullRequest
17 голосов
/ 13 апреля 2011

Мне часто нужно клонировать производственные данные, чтобы исследовать ошибки. Даже при простом размере базы данных heroku db: pull (taps) занимает 5+ минут и, похоже, с большой вероятностью провалится. Есть ли альтернативный метод для извлечения базы данных?

Также приветствуются библиотеки для альтернативных процессов / статей.

Ответы [ 6 ]

23 голосов
/ 13 апреля 2011

Проверить pgbackups . Он заменил команду Heroku Bundle и даст вам Postgres-эквивалент mysqldump. Это гораздо более цивилизованно, чем 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: подключение к базе данных для восстановления

12 голосов
/ 15 апреля 2011

Я создал сценарий оболочки, который автоматизирует этот процесс (на основе ответа Майка Уильямсона).

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 голосов
/ 13 апреля 2011

Mike's right - PGBackups - это способ сделать это.Когда вы создаете резервную копию с помощью PGBackups, вы получаете доступ к стандартному файлу pg_dump. Вот соответствующий раздел статьи PGBackups Центра разработки.

1 голос
/ 28 сентября 2016

Этот пост сейчас довольно старый.

Новейший и самый простой метод сейчас использует Heroku pg: pull / pg: push

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

Вот сценарий, который я написал, который использует pg:pull, как упомянуто Ломефином, чтобы снять дБ с 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 клонирует вновая база данных, ваша работа не будет прервана (только после переименования БД, что занимает доли секунды).Сценарий, конечно, можно легко настроить по своему вкусу.

0 голосов
/ 17 января 2015

Обновление сценария Джека с рекомендацией 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! :) =="
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...