Linux 备份实战:tar 与 gzip 组合 3 种高效用法与脚本示例
Linux 备份实战tar 与 gzip 组合 3 种高效用法与脚本示例在 Linux 系统管理中数据备份是每个运维工程师的必修课。面对海量日志、配置文件和应用数据如何高效地进行压缩备份既节省存储空间又便于管理本文将深入探讨 tar 和 gzip 这对黄金组合的三种实战用法并提供可直接投入生产的 Shell 脚本示例。1. 基础原理为什么选择 tar gzip在开始实战前我们需要理解这两个工具的核心特性tarTape Archive专为目录和文件集合设计保留完整的文件属性权限、时间戳等支持增量备份--listed-incremental不提供压缩功能仅实现归档gzip基于 DEFLATE 算法的高效压缩压缩率通常在60%-70%文本文件单文件处理模式无法直接操作目录支持1-9级压缩-1最快/-9最佳组合优势对比表工具组合目录支持压缩率保留属性适用场景纯gzip❌★★★❌单文件快速压缩纯tar✔️-✔️目录归档不压缩targzip✔️★★★★✔️生产环境备份提示在需要更高压缩比的场景可考虑将gzip替换为bzip2.tar.bz2或xz.tar.xz但会显著增加CPU消耗2. 实战方案一带时间戳的全量备份这是最基本的备份策略适合中小型项目的定期全量备份。以下脚本实现了自动添加备份时间戳显示实时压缩进度保留原始文件权限#!/bin/bash # 全量备份脚本 full_backup.sh BACKUP_SRC/var/www /etc/nginx # 需要备份的目录 BACKUP_DEST/backups # 备份存储位置 PREFIXfull_backup # 备份文件前缀 TIMESTAMP$(date %Y%m%d_%H%M%S) BACKUP_FILE${BACKUP_DEST}/${PREFIX}_${TIMESTAMP}.tar.gz echo 开始全量备份: $(date) tar -czvf ${BACKUP_FILE} \ --absolute-names \ --warningno-file-changed \ ${BACKUP_SRC} 21 | while read line; do echo -n . done echo -e \n备份完成: ${BACKUP_FILE} ls -lh ${BACKUP_FILE}关键参数解析-c创建新归档-z使用gzip压缩-v显示处理文件通过管道实现进度点显示--absolute-names保留绝对路径谨慎使用--warningno-file-changed忽略备份期间文件变化的警告典型输出开始全量备份: Mon Jul 15 14:30:22 CST 2023 ......... 备份完成: /backups/full_backup_20230715_143022.tar.gz -rw-r--r-- 1 root root 1.2G Jul 15 14:31 /backups/full_backup_20230715_143022.tar.gz3. 实战方案二排除特定文件类型的智能压缩实际备份时我们经常需要排除临时文件、日志或缓存等非必要内容。这个脚本展示了如何通过模式匹配排除文件自动清理旧备份记录备份日志#!/bin/bash # 排除型备份脚本 exclude_backup.sh CONFIG_FILE/etc/backup_exclude.conf # 排除规则配置文件 LOG_FILE/var/log/backup.log { echo 备份开始 $(date) # 读取排除规则每行一个模式 if [ -f ${CONFIG_FILE} ]; then EXCLUDE_FROM--exclude-from${CONFIG_FILE} else cat ${CONFIG_FILE} EOF *.tmp *.log *.cache /tmp/* /var/cache/* EOF echo 生成默认排除配置文件: ${CONFIG_FILE} fi # 生成备份文件名 BACKUP_FILE/backups/exclude_$(hostname)_$(date %Y%m%d).tar.gz # 执行备份 tar -czf ${BACKUP_FILE} \ ${EXCLUDE_FROM} \ --exclude*.tar.gz \ --exclude*.iso \ / 2/dev/null # 清理7天前的备份 find /backups -name exclude_*.tar.gz -mtime 7 -delete echo 生成备份: ${BACKUP_FILE} echo 磁盘使用: $(df -h ${BACKUP_FILE%/*}) echo 备份完成 $(date) } ${LOG_FILE} 21排除规则配置示例# 注释行以#开头 *.swp *.bak ~$* .DS_Store .thumbnails/注意排除规则支持通配符和完整路径匹配规则文件需每行一个模式4. 实战方案三基于find的增量备份策略对于大型系统全量备份效率低下。这个方案利用find命令实现按时间筛选新增/修改文件多线程压缩加速处理自动验证备份完整性#!/bin/bash # 增量备份脚本 incremental_backup.sh LAST_BACKUP_TIME_FILE/var/last_backup.time MIN_FILE_SIZE10M # 不压缩小文件 THREADS$(nproc) # 使用全部CPU核心 # 获取上次备份时间 if [ -f ${LAST_BACKUP_TIME_FILE} ]; then SINCE_TIME-newermt $(cat ${LAST_BACKUP_TIME_FILE}) else echo 首次运行将执行全量备份 SINCE_TIME fi # 生成文件列表 FILE_LIST$(mktemp) find /data \ -type f \ ${SINCE_TIME} \ -size ${MIN_FILE_SIZE} \ -not -name *.gz \ -print0 ${FILE_LIST} # 多线程压缩 echo 发现 $(wc -l ${FILE_LIST}) 个待处理文件 cat ${FILE_LIST} | xargs -0 -P ${THREADS} -I {} sh -c gzip -k -9 {} echo 压缩完成: {} # 更新备份时间 date %Y-%m-%d %H:%M:%S ${LAST_BACKUP_TIME_FILE} rm -f ${FILE_LIST} echo 增量备份完成于: $(cat ${LAST_BACKUP_TIME_FILE})性能优化技巧使用-P参数实现并行处理通过-size过滤小文件避免压缩负收益-print0配合-0处理含空格文件名记录时间戳实现真正的增量5. 高级技巧与故障处理5.1 备份完整性验证在关键任务备份后务必验证归档文件# 检查tar.gz完整性 check_archive() { if gzip -t $1 tar -tzf $1 /dev/null; then echo 验证通过: $1 return 0 else echo 损坏的归档: $1 2 return 1 fi } # 示例用法 check_archive /backups/full_backup_20230715.tar.gz5.2 网络传输优化当需要传输备份文件时使用管道避免临时文件# 边压缩边传输到远程服务器 tar -czf - /data | ssh userbackup-server cat /backups/remote_$(date %Y%m%d).tar.gz # 带进度显示版本 pv /data | tar -czf - | ssh userbackup-server cat /backups/remote.tar.gz5.3 异常处理模板在自动化备份脚本中加入错误处理#!/bin/bash # 带错误处理的备份脚本 set -euo pipefail # 严格模式 trap cleanup $? EXIT cleanup() { if [ $1 -ne 0 ]; then echo 备份失败错误码: $1 2 # 发送警报 send_alert Backup failed with code $1 fi rm -f ${TEMP_FILE:-/tmp/nonexistent} } send_alert() { # 实现邮件/短信报警 echo $1 | mail -s 备份警报 adminexample.com } main() { local temp_file$(mktemp) # 备份操作... } main6. 恢复策略与最佳实践6.1 典型恢复操作# 解压到原位置保留权限 tar -xzvf backup.tar.gz -C / # 仅提取特定文件 tar -tzvf backup.tar.gz | grep important_file tar -xzvf backup.tar.gz path/to/file6.2 备份策略建议3-2-1规则至少3份副本2种不同介质1份异地备份生命周期管理# 自动清理旧备份 find /backups -name *.tar.gz -type f -mtime 30 -delete监控关键指标# 检查备份文件大小变化 watch -n 3600 du -sh /backups/*.tar.gz在实际运维中我曾遇到过一个典型案例某服务器因存储故障导致数据丢失但由于实施了本文介绍的增量备份方案最终仅丢失了15分钟内的数据远优于传统的每日全备方案。这印证了选择合适的备份策略对业务连续性的重要性。