有没有比Her Tap更快的从Heroku中提取生产数据的方法?

| 我经常需要克隆生产数据来调查错误。即使数据库大小很小,heroku db:pull(tap)仍需要5分钟以上的时间,并且似乎很有可能失败。是否有另一种拉数据库的方法? 替代过程/文章的图书馆也将不胜感激。     
已邀请:
查看pgbackups。它取代了Heroku bundle命令,并为您提供了与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:连接到数据库进行还原     
我创建了一个Shell脚本来自动执行此过程(基于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
    
Mike \'s正确-PGBackups是执行此操作的方法。使用PGBackups创建备份时,可以访问标准pg_dump文件。这是Dev Center PGBackups文章的相关部分。     
这篇文章现在已经很老了。 目前最新,最简单的方法是使用Heroku的pg:pull / pg:push     
Jack脚本的更新,Heroku的推荐截至2015年1月。 第一部分是由于在不同的计算机上运行,​​因此我的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! :) ==\"
    
这是我写的一个脚本,该脚本使用了Lomefin提到的ѭ5来从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;\"
由于“ 5”会克隆到新数据库,因此您的工作将不会中断(仅当它重命名数据库后才花费一秒钟的时间)。当然,可以根据自己的喜好轻松定制脚本。     

要回复问题请先登录注册