外观
3.1 备份脚本编写
约 499 字
备份定时任务
本页对应「三、操作步骤」的 3.1,完成备份脚本编写。返回上级:自动备份方案说明。
前置条件
- 备份目录已挂载且可写,剩余容量为数据量的 3 倍以上。
- 数据库备份账号已创建,具备 SELECT、LOCK TABLES、SHOW VIEW、TRIGGER 权限。
- /srv/axis/scripts 目录存在,属主为 deploy。
操作步骤
- 创建目录结构并初始化凭据文件,凭据文件仅属主可读。
sudo install -d -m 750 -o deploy -g deploy /srv/axis/backup/daily /srv/axis/backup/log
sudo install -m 600 -o deploy -g deploy /dev/null /srv/axis/scripts/.my.cnf- 写入
/srv/axis/scripts/.my.cnf,密码替换为实际值,不要复用 root 密码:
[client]
user=backup
password=CHANGE_ME
host=127.0.0.1- 编写
/srv/axis/scripts/backup.sh:
#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%F_%H%M)
ROOT=/srv/axis
DEST=$ROOT/backup/daily
LOG=$ROOT/backup/log/backup-$STAMP.log
exec >>"$LOG" 2>&1
echo "[$(date -Is)] backup start"
mysqldump --defaults-extra-file=$ROOT/scripts/.my.cnf \
--single-transaction --quick --routines --triggers \
axis | gzip -9 > "$DEST/axis-db-$STAMP.sql.gz"
tar -czf "$DEST/axis-files-$STAMP.tar.gz" \
--exclude='backup' --exclude='logs/*.log' -C "$ROOT" www
cd "$DEST"
sha256sum "axis-db-$STAMP.sql.gz" "axis-files-$STAMP.tar.gz" > "axis-$STAMP.sha256"
find "$DEST" -type f -mtime +14 -delete
echo "[$(date -Is)] backup done"- 赋权并手动执行一次。
sudo chmod 750 /srv/axis/scripts/backup.sh
sudo chown deploy:deploy /srv/axis/scripts/backup.sh
sudo -u deploy /srv/axis/scripts/backup.sh
echo "exit=$?"- 校验产物完整性与压缩包可读性。
ls -lh /srv/axis/backup/daily
cd /srv/axis/backup/daily && sha256sum -c axis-*.sha256
gzip -t /srv/axis/backup/daily/axis-db-*.sql.gz结果确认
- 脚本退出码为 0,日志末尾为
backup done。 - daily 目录出现两个压缩包与一个 .sha256 文件,大小与源数据量级相符。
sha256sum -c全部 OK,gzip -t无报错。tar -tzf能列出文件列表,末尾无Unexpected EOF。
注意事项
set -euo pipefail保证任一环节失败立即中止,避免产出不完整却被标记成功。--single-transaction与--quick组合可缩短锁表时间,但备份期间仍会占用磁盘 IO。- 脚本内路径全部写绝对路径,cron 环境的 PATH 与登录 shell 不同。
- 凭据文件不要放在站点目录内,避免被静态服务对外暴露。