[Ruby-on-rails] Heroku에서 생산 데이터를 끌어 올리는 더 빠른 방법이 있습니까?


Answers

이 프로세스를 자동화하는 쉘 스크립트를 만들었습니다 (Mike Williamson의 대답을 기반으로).

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
Question

종종 버그를 조사하기 위해 생산 데이터를 복제해야합니다. 평범한 데이터베이스 크기로도 heroku db : pull (taps)은 5 분 이상 걸리며 실패 할 확률이 높습니다. 데이터베이스를 가져 오기위한 다른 방법이 있습니까?

대체 공정 / 기사를위한 도서관도 감사 할 것입니다.







다음은 Lomefin이 언급 한 pg:pull 을 사용하여 작성한 스크립트입니다. Heroku에서 db를 풀다가 로컬 데이터베이스로 대체합니다.

#!/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 복제본을 새 데이터베이스로 pg:pull 오면 작업이 중단되지 않습니다 (단 1 분이 걸리는 db의 이름을 바꾼 후에 만). 물론 스크립트는 원하는대로 쉽게 사용자 지정할 수 있습니다.