在Heroku Bash中创建数据库备份

4
我希望能定期将数据库转储存档到我的AWS账户中的S3,最终存储在冰川中。是否有一种方法可以从dyno内部将postgresql数据库转储到文件系统中(然后我可以从那里将文件发送到AWS)?在dyno上似乎没有psql和pg_dump可用,并且我不知道如何在dyno内运行pgbackups。

我不知道你问题的答案,但如果你的最终目标是将东西放在S3上,请查看PG Backups,它可以自动完成。 - Jon Mountjoy
是的,我知道,但这实际上会在几天后从那里删除,而我想将所有转储保留在冰川中。 - huesforalice
PGBackups非常好,但它在一个月后会删除所有备份。我们还需要将定期备份永久存储到Glacier中,因此对这个问题的答案将是非常棒的。 - B Robster
请原谅我的无知,但是你可以使用SSH创建一个隧道并在其上进行备份吗? - Kirk Roybal
2个回答

2
创建一个单独的Heroku应用程序来进行备份,该应用程序使用pgbackups-archive gem,然后设置一个Heroku调度程序,定期在您的DATABASE_URL上运行pgbackups-archive gem(您需要从其他应用程序导入该环境变量),如此处所述。
免责声明:这实际上需要您使用一些Ruby,但与使用Heroku Postgres的任何Heroku Cedar应用程序(包括Django应用程序)配合使用。

感谢你的建议,Ben。我正在寻找Python / Django应用程序的解决方案。实际上,我还收到了Heroku支持团队的消息,他们声称正在开发一种解决方案,可以将pgbackups导入你自己的S3 Bucket中,这将非常棒。 - huesforalice
是的,我们也使用Python / Django来开发我们的应用程序,但是为了从我们的应用程序中进行备份,我们设置了另一个Heroku应用程序,并使用与我们的应用程序相同的DATABASE_URL,使用链接中的方法非常容易且是我们能找到的最佳方法。 - B Robster

1

目前我能想到的最好方法是使用pgbackups插件(我一直在使用),然后每天从s3中拉取最新备份并将其重新上传到我的存储桶中。如果启用了此插件,Heroku会公开PGBACKUPS_URL环境变量。其余步骤大致如下:

    # boto and requests are required, aws access credentials are in the settings file 

    url = settings.PGBACKUPS_URL + "/latest_backup"
    dumpfile = "./db_dump"

    # get latest backup info
    r = requests.get(url)
    dump_url = r.json()["public_url"]
    dump_timestamp = r.json()["finished_at"].replace("/", "-")
    dump_name = "db_dumps/" + dump_timestamp

    # write dump to file
    r = requests.get(dump_url, stream=True)
    if r.status_code == 200:
        with open(dumpfile, 'wb') as f:
            for chunk in r.iter_content():
                f.write(chunk)

    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
    bucket = conn.get_bucket(settings.AWS_DB_DUMPS_BUCKET)
    key = bucket.new_key(dump_name)
    key.set_contents_from_filename(dumpfile)

我还不确定是否可以通过PGBACKUPS_URL来触发备份。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接