Autobus插件将从Heroku移除,求PostgreSQL自动备份替代方案
无Autobus支持下自动备份Heroku PostgreSQL数据库的方案
下面是几种低成本、可落地的自动备份方案,无需依赖第三方付费插件:
方案1:Heroku官方备份工具 + Heroku Scheduler
Heroku自带的pg:backups工具可以直接创建数据库备份,结合Heroku Scheduler(免费 tier 足够日常使用)实现自动调度:
配置云存储(以AWS S3为例)
在Heroku应用中配置AWS密钥,用于将备份上传到S3:heroku config:set AWS_ACCESS_KEY_ID=你的AWS访问密钥 AWS_SECRET_ACCESS_KEY=你的AWS密钥 --app 你的应用名添加定时备份任务
打开Heroku Scheduler控制面板,添加一个定时任务(比如每天凌晨2点执行),命令如下:heroku pg:backups:capture --app 你的应用名 && heroku pg:backups:copy latest s3://你的存储桶名/backups/$(date +%Y%m%d%H%M).dump --app 你的应用名这个命令会自动创建最新备份,并以时间戳命名上传到S3指定路径。
可选:设置备份保留策略
可以通过Heroku命令设置自动删除旧备份:heroku pg:backups:rotate --app 你的应用名 --keep 7上述命令会保留最近7天的备份。
方案2:自定义Shell脚本 + 外部定时调度(VPS/GitHub Actions)
如果需要更灵活的备份逻辑(比如多存储源、自定义验证),可以写脚本结合外部定时工具:
编写备份脚本
创建backup-heroku-pg.sh文件,内容如下:#!/bin/bash export HEROKU_API_KEY=你的Heroku API密钥 APP_NAME="你的应用名" BUCKET_NAME="你的S3存储桶名" BACKUP_FILE="heroku-pg-backup-$(date +%Y%m%d%H%M).dump" # 捕获数据库备份 heroku pg:backups:capture --app $APP_NAME # 下载备份到本地 heroku pg:backups:download -o $BACKUP_FILE --app $APP_NAME # 上传到S3(需提前在执行环境安装aws-cli并配置权限) aws s3 cp $BACKUP_FILE s3://$BUCKET_NAME/backups/ # 清理本地备份文件 rm $BACKUP_FILE给脚本添加执行权限:
chmod +x backup-heroku-pg.sh设置定时任务
- 如果用VPS:编辑crontab(
crontab -e),添加每天凌晨执行的任务:0 2 * * * /path/to/backup-heroku-pg.sh >> /var/log/heroku-backup.log 2>&1 - 如果用GitHub Actions:创建
.github/workflows/heroku-backup.yml,利用GitHub的定时触发器执行脚本(需在仓库 Secrets 中配置Heroku API密钥和AWS密钥)。
- 如果用VPS:编辑crontab(
方案3:直接使用pg_dump备份
适合需要直接控制备份格式、跳过特定表的场景:
准备执行环境
确保执行环境安装了postgresql-client(即pg_dump工具),并将执行环境的IP添加到Heroku数据库的信任IP列表(在Heroku Dashboard的数据库设置中配置)。编写定时备份命令
直接通过pg_dump连接Heroku数据库并生成备份:pg_dump $(heroku config:get DATABASE_URL --app 你的应用名) -Fc -f backup-$(date +%Y%m%d%H%M).dump其中
-Fc参数表示生成PostgreSQL自定义格式备份,便于后续恢复。同样可以将这个命令加入crontab,结合云存储上传脚本完成自动备份。
关键注意事项
- 备份验证:定期执行恢复测试,确保备份文件可用,比如用
pg_restore -d 测试数据库名 备份文件名.dump验证。 - 密钥安全:所有云服务密钥、Heroku API密钥都要通过环境变量或Secrets管理,不要硬编码在脚本中。
- 存储冗余:建议将备份存放在与Heroku不同区域的云存储中,避免因区域故障丢失数据。
内容的提问来源于stack exchange,提问作者Jonathan Oliveira
相关产品推荐
相关产品推荐

