Подтвердить что ты не робот

Есть ли более быстрый способ вытащить данные о производстве из Heroku Than Taps?

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

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

4b9b3361

Ответ 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 можно, конечно, легко настроить по своему вкусу.