一、前置准备:确认备份系统现状
1. 检查当前备份存储占用
登录服务器执行以下命令,查看各目录的空间占用情况:
```
du -h --max-depth=1 /backup
```
输出中最左侧是目录大小,右侧是目录路径,优先关注占比超过50%的目录,后续针对性处理。如果是Windows服务器,可在CMD中执行(替换D:\Backup为你的备份目录):
```
dir /s /w "D:\Backup"
```
2. 识别备份冗余类型
服务器备份冗余主要分两类,需先明确:
- 过期备份:超过预设保留周期的无用备份文件
- 重复备份:多个内容完全相同的备份文件(多由错误备份或增量备份冗余导致)
二、核心实操步骤:空间优化落地
1. 清理过期备份文件
推荐新手先手动验证再用自动脚本,避免误删有效备份:
手动清理步骤:
- 先确认过期备份列表(以30天前的.tar.gz备份为例):
```
find /backup -type f -name ".tar.gz" -mtime +30 -ls
```
- 确认无误后执行删除:
```
find /backup -type f -name ".tar.gz" -mtime +30 -delete
```
自动清理(crontab定时任务):
- 编辑crontab任务:
```
crontab -e
```
- 添加以下内容(每天凌晨2点执行,保留近30天的.tar.gz备份):
```
0 2 find /backup -type f -name ".tar.gz" -mtime +30 -delete
```
说明:mtime的+30表示「修改时间距现在超过30天」,若备份为.bak后缀,将-name过滤条件改为.bak即可。
2. 消除重复备份
用开源工具fdupes快速查找并删除重复文件,支持递归目录:
2.1 安装fdupes
- Debian/Ubuntu系列:
```
apt install fdupes -y
```
- CentOS/RHEL系列:
```
yum install epel-release -y && yum install fdupes -y
```
2.2 查找并删除重复备份
- 先查看重复文件列表(仅查看不删除):
```
fdupes -r /backup
```
- 确认后删除重复文件(会提示保留哪个副本,输入y确认):
```
fdupes -r -d /backup
```

参数说明:-r递归子目录,-d删除重复文件,删除前务必核对列表内容。
3. 优化备份格式与压缩率
默认gzip压缩可替换为高压缩算法,节省30%-50%空间:
- 原gzip备份命令:
```
tar -czvf /backup/old_backup.tar.gz /data
```
- 替换为xz高压缩算法(压缩率更高,耗时略长):
```
tar -cJvf /backup/new_backup.tar.xz /data
```
- 替换为lz4高速压缩(耗时短,压缩率略低于xz):
```
tar -cf - /data | lz4 - /backup/new_backup.tar.lz4
```
解压命令:xz解压```tar -xJvf 文件名```,lz4解压```lz4 -d 文件名 | tar -x```,按需使用。
4. 配置分层保留策略
采用「日备份保留7天、周备份保留4周、月备份保留12个月」的分层策略,避免误删关键备份,用脚本自动实现:
完整备份脚本(直接复制,替换变量即可):
```
!/bin/bash
替换为你的备份目录
BACKUP_DIR="/backup"
替换为你的源数据目录
DATA_DIR="/data"
1. 每日备份:保留7天
DATE=$(date +%Y%m%d)
tar -cJvf $BACKUP_DIR/daily_$DATE.tar.xz $DATA_DIR
find $BACKUP_DIR -name "daily_.tar.xz" -type f -mtime +7 -delete
2. 每周备份:仅周日执行,保留4周
if [ $(date +%w) -eq 0 ]; then
WEEK=$(date +%Y%W)
tar -cJvf $BACKUP_DIR/week_$WEEK.tar.xz $DATA_DIR
find $BACKUP_DIR -name "week_.tar.xz" -type f -mtime +28 -delete
fi
3. 每月备份:仅1号执行,保留12个月
if [ $(date +%d) -eq 1 ]; then
MONTH=$(date +%Y%m)
tar -cJvf $BACKUP_DIR/month_$MONTH.tar.xz $DATA_DIR
find $BACKUP_DIR -name "month_.tar.xz" -type f -mtime +365 -delete
fi
```
部署步骤:
- 保存为/opt/backup_rotate.sh
- 赋予执行权限:
```
chmod +x /opt/backup_rotate.sh
```
- 配置crontab每天凌晨3点执行:添加
```
0 3 /bin/bash /opt/backup_rotate.sh
```
三、验证与日常维护
1. 定期验证备份完整性
备份损坏会导致恢复失败,每月至少验证1次:
- 列出备份内容确认文件无缺失:
```
tar -tJvf /backup/daily_20240520.tar.xz
```
- 生成MD5校验值(备份时同步生成):
```
md5sum /backup/daily_20240520.tar.xz > /backup/daily_20240520.tar.xz.md5
```
- 验证完整性:
```
md5sum -c /backup/daily_20240520.tar.xz.md5
```
输出显示OK则备份完整,否则需重新备份
2. 实时监控备份空间
避免空间满导致备份失败,用工具+脚本监控:
- 安装ncdu(交互式目录占用查看):
```
apt install ncdu -y
```
- 运行ncdu查看/backup目录:
```
ncdu /backup
```
(按q退出,上下键切换目录查看大小)
- 空间告警脚本(超过80%发送邮件,替换ADMIN_EMAIL为实际邮箱):
```
!/bin/bash
BACKUP_MOUNT="/backup"
ADMIN_EMAIL="admin@example.com"
USAGE=$(df -P $BACKUP_MOUNT | awk 'NR==2 {print $5}')
USAGE_NUM=${USAGE%?}
if [ $USAGE_NUM -gt 80 ]; then
echo "备份目录$BACKUP_MOUNT空间占用达$USAGE,超过阈值80%,请清理!" | mail -s "备份空间告警" $ADMIN_EMAIL
fi
```
- 配置crontab每小时执行:
```
0 /bin/bash /opt/backup_monitor.sh
```