用crontab定时备份postgresql需两步:先写含绝对路径pg_dump、环境变量、日期命名、日志记录的shell脚本,再以postgres用户用绝对路径配置crontab调度,并验证执行效果与自动清理。

用 Crontab 定时触发 PostgreSQL 数据库导出备份,核心是两步:写一个能正确执行 pg_dump 的 Shell 脚本,再用 crontab 在指定时间调用它。关键不在“能不能”,而在“环境对不对、权限够不够、路径准不准”。
确保 pg_dump 可被脚本直接调用
很多失败源于脚本里找不到 pg_dump。不要依赖 PATH,直接用绝对路径(如 /usr/bin/pg_dump 或 /usr/lib/postgresql/*/bin/pg_dump)。可在终端运行 which pg_dump 确认。
- 在脚本开头显式设置环境变量,尤其
PGUSER、PGPASSWORD(或改用.pgpass文件更安全) - 若用密码,避免明文写在命令行里,推荐配置
~/.pgpass并设权限为600 - 指定数据库主机(
-h)、端口(-p)、数据库名(-d)和输出路径,路径需存在且可写
编写带日期命名与日志的备份脚本
脚本要能独立运行,不依赖交互式 shell 环境。典型结构包括:创建备份目录、生成带日期的文件名、执行导出、压缩(可选)、清理旧文件、记录日志。
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
- 用
$(date +\%Y\%m\%d)生成日期字符串,避免空格或特殊字符影响文件名 - 导出建议用自定义格式(
-Fc),体积小、支持并行恢复,比纯 SQL 更高效 - 加
2>&1将错误也记入日志,方便排查;日志路径需提前建好、权限匹配 - 示例片段:
/usr/bin/pg_dump -U postgres -d mydb -Fc -f /backup/mydb_$(date +\%Y\%m\%d).dump 2>&1
用 crontab 正确调度脚本
必须以能访问数据库的用户(通常是 postgres)身份编辑 crontab,否则权限或环境变量会出错。
- 切到目标用户执行
sudo -u postgres crontab -e,而不是 root 的 crontab - cron 时间字段顺序是:分 时 日 月 周,例如
0 2 * * *表示每天凌晨 2 点 - 命令路径写绝对路径,如
/home/postgres/backup.sh;避免用~或相对路径 - 重定向日志到明确位置,例如
0 2 * * * /home/postgres/backup.sh >> /var/log/pg_backup.log 2>&1
验证与维护要点
设完别以为万事大吉,得确认它真能跑、跑得稳、留得久。
- 手动执行一次脚本,看是否生成文件、无报错、权限正常
- 用
crontab -l检查任务是否生效,注意编辑后是否保存退出 - 定期检查备份文件大小和时间戳,异常小或为空说明失败
- 自动清理旧备份(如保留最近 7 天),用
find /backup -name "mydb_*.dump" -mtime +7 -delete










