最省事的Linux备份方法是用tar -czf直接打包压缩,无需管道或中间文件;-z调用gzip流式压缩,-f指定输出,-c创建归档,三者缺一不可。
用 tar 一次性打包并 gzip 压缩最省事
绝大多数 linux 备份场景下,tar 自带 -z 参数就能直接调用 gzip,不用管道、不生成中间文件,既快又省空间。它本质是 tar 调用系统 gzip 库流式压缩,内存占用低,io 也比先 tar 再 gzip 少一次读写。
常见错误是写成 tar -cf backup.tar /data | gzip > backup.tar.gz —— 这样 tar 默认不压缩,管道还会因缓冲问题丢文件或卡住;正确写法就一条命令:
tar -czf backup-$(date +%Y%m%d).tar.gz /var/www /etc/nginx
-
-c创建归档,-z启用 gzip,-f指定输出文件,三者缺一不可 - 路径不要以
/开头(如/var/www可以,但//var/www可能触发 tar 的绝对路径警告) - 如果源路径含空格,必须用引号包裹,否则
tar只取第一个单词
gzip 压缩级别影响备份时间和磁盘节省比
gzip 默认用 -6 级别(1~9),时间与压缩率权衡点较合理。盲目设 -9 可能让备份慢 3 倍,但体积只少 5%~10%,对日志类文本有效,对已压缩过的 .jpg 或 .zip 文件几乎无用,还白耗 CPU。
实操建议直接控制 tar 的 --gzip 参数传参:
tar -cf backup.tar.gz --use-compress-program="gzip -1" /data
-
-1:最快,适合大文件、定时任务怕超时 -
-6:默认,平衡项,日常备份首选 -
-9:仅对纯文本、SQL 导出、未压缩日志等有意义 - 别在脚本里写
GZIP=-9 tar -zcf ...—— 有些旧版tar不认这个环境变量
备份脚本里漏加 --remove-files 会导致磁盘悄悄爆满
很多人以为 tar -zcf archive.tar.gz /data 是“移动式”备份,其实只是复制。若后续没手动删原目录,或脚本没加清理逻辑,重复运行几次后,/data 和 archive.tar.gz 两份全存着,空间翻倍。
安全做法是分两步确认:先压缩成功,再删源(避免压缩中断导致数据丢失):
if tar -czf backup.tar.gz /data && [ -s backup.tar.gz ]; then rm -rf /data fi
-
[ -s backup.tar.gz ]确保文件非空,防tar因权限失败却返回 0 - 绝不直接用
tar --remove-files—— 它在压缩中途失败时会删掉部分已处理的文件,造成数据残缺 - 生产环境建议先
rsync --dry-run或打个标记文件,留出人工核对窗口
遇到 gzip: stdout: No space left on device 别急着清日志
这个错不一定真没空间。常见真实原因是:目标分区 /tmp(tar 默认用它做临时缓冲)满了,而你正往 /backup 写,但 tar 内部仍依赖 /tmp。尤其容器或精简系统里,/tmp 可能只有几十 MB。
验证方式:df -h /tmp 和 df -h /backup 都要看。解决方法优先改缓存位置:
TAR_TMPDIR=/backup/.tmp tar -czf backup.tar.gz /data
- 提前
mkdir -p /backup/.tmp并确保有写权限 - 别用
export TMPDIR=...全局设 —— 可能影响其他并发进程 - 如果连
/backup本身空间也紧,考虑用--tape-length分卷,但需配套解压逻辑,复杂度陡增
压缩这件事,真正麻烦的从来不是命令怎么敲,而是搞不清数据在哪、空间从哪来、失败时删了什么又留了什么。










