全量备份脚本需具备时间戳命名、路径预创建、7天自动清理、完整path声明、绝对路径调用、日志重定向及密码安全机制,并须手动验证与定期抽检。

用 Crontab 做全量备份,关键不是“加个定时任务”就完事,而是让备份脚本本身可靠、路径明确、日志可查、失败能感知。Crontab 只是调度器,真正干活的是你写的那个备份脚本。
写一个带时间戳和清理逻辑的全量备份脚本
全量备份通常用 tar 或 mysqldump 等工具打包整个目录或数据库。脚本要包含以下要素:
- 用
date +%Y%m%d_%H%M生成唯一文件名,避免覆盖,例如:backup_web_20260614_2105.tar.gz - 目标目录提前创建(
mkdir -p /backup/full/),确保路径存在 - 备份后加一句清理:只保留最近 7 天的全量包,用
find /backup/full -name "backup_*.tar.gz" -mtime +7 -delete - 开头声明完整 PATH,比如:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH - 所有命令用绝对路径,如
/bin/tar、/usr/bin/mysqldump,不依赖环境变量
在 Crontab 中正确添加定时任务
别直接在 crontab 里写长命令,而是调用脚本,并做好重定向:
- 编辑当前用户任务:
crontab -e - 添加一行,例如每天凌晨 2:15 执行:
15 2 * * * /bin/bash /usr/local/bin/backup_full.sh >> /var/log/backup_full.log 2>&1 - 务必用
/bin/bash显式调用,避免 crond 默认 shell(如 dash)不支持$(( ))或数组语法 - 日志重定向不可省略,
2>&1把错误也记下来,否则失败无声无息
针对数据库做全量备份要特别注意密码安全
MySQL 或 PostgreSQL 全量导出时,密码不能写在脚本里明文暴露:
- MySQL 推荐用配置文件方式:创建
~/.my.cnf,设置权限chmod 600 ~/.my.cnf,内容为:
user=backup_user
password=your_secure_password
- 脚本中直接调用:
/usr/bin/mysqldump --all-databases > /backup/db_full_$(date +%Y%m%d).sql,无需 -p 参数 - PostgreSQL 类似,用
~/.pgpass文件配合PGPASSFILE环境变量
验证和日常维护不能跳过
设完不等于跑通,必须手动验证+定期抽检:
- 先手动运行一次脚本:
/usr/local/bin/backup_full.sh,确认压缩包生成、大小合理、能解压 - 检查日志:
tail -20 /var/log/backup_full.log,看是否有 “tar: Cannot open…” 或 “command not found” - 每周抽一个备份文件,用
tar -tzf查看内容列表,确认没空包 - 每月清点一次
/backup/full/目录,核对文件数量是否符合保留策略











