如何解决有没有比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”会克隆到新数据库,因此您的工作将不会中断(仅当它重命名数据库后才花费一秒钟的时间)。当然,可以根据自己的喜好轻松定制脚本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。