是否有更快的方式从Heroku而不是水龙头中提取生产数据?

时间:2011-04-13 13:14:39

标签: ruby-on-rails heroku

我经常需要克隆生产数据来调查错误。即使有一个简单的数据库大小heroku db:拉(点击)需要5分钟以上,似乎很有可能失败。 是否有其他方法来提取数据库?

也欢迎替代流程/文章的图书馆。

6 个答案:

答案 0 :(得分:23)

结帐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:连接到数据库进行恢复

答案 1 :(得分:12)

我创建了一个自动执行此过程的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

答案 2 :(得分:3)

迈克是正确的 - PGBackups是这样做的方法。使用PGBackups创建备份时,可以访问标准的pg_dump文件。 Here's开发中心PGBackups文章的相关部分。

答案 3 :(得分:1)

这篇文章现在很老了。

目前最新,最简单的方法是使用Heroku的pg:pull/pg:push

答案 4 :(得分:0)

Jack's脚本的更新,截至2015年1月为Heroku's recommendation

第一部分是由于在不同的计算机上运行,​​因此我的Postgres dbs有不同的名称。

#!/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! :) =="

答案 5 :(得分:0)

这是我编写的一个脚本,利用{Lomefin提到的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克隆到新数据库,因此您的工作不会被中断(只有在重命名数据库时才会中断,这需要几分之一秒)。当然,该脚本可以根据您的喜好轻松定制。