XtraBackup是生产环境MySQL全量热备的首选工具,无锁备份、支持增量、兼容主流MySQL版本,稳定性拉满。
但近期在生产运维中,遇到了一个非常迷惑的异常现象:
XtraBackup打包压缩后的备份文件,逻辑大小只有4.3G,磁盘实际占用却达到8.0G,磁盘空间莫名被大量占用;隔日再次执行全量备份后,异常自动消失,文件大小、磁盘占用完全匹配。

不少同学第一时间会怀疑:备份文件损坏、磁盘坏道、文件系统故障、脚本异常?
其实全都不是!今天结合真实线上操作日志,带你彻底拆解这个XtraBackup+Linux文件系统的底层隐藏坑。
一、真实现场问题复盘
先还原完整操作日志,百分百复刻生产现场:
1. 首次备份完成
查看备份目录文件列表:
[root@static2 backup]# ll -h
总用量 8.0G
-rw------- 1 root root 4.3G 4月 27 17:59 ALL_BACKUP-192.168.*.*-260427.tar.gz
-rwx------ 1 root root 1.2K 4月 27 17:46 fullbackup.sh
-rw------- 1 root root 72K 4月 27 17:59 nohup.out
ll -h清晰看到:备份压缩包逻辑大小4.3G。
再使用du -sh统计磁盘实际占用:
[root@static237 backup]# du -sh *
8.0G ALL_BACKUP-192.168.*.*-260427.tar.gz
4.0K fullbackup.sh
128K nohup.out
同一个文件,磁盘物理占用直接翻倍到8.0G,空间严重虚耗。
2. 二次全量备份后
间隔一天,定时任务自动执行第二次XtraBackup全量备份:
[root@static2 backup]# ll -h
总用量 8.5G
-rw------- 1 root root 4.3G 4月 27 17:59 ALL_BACKUP-192.168.*.*-260427.tar.gz
-rw-r--r-- 1 root root 4.3G 4月 28 03:41 ALL_BACKUP-192.168.*.*-260428.tar.gz
-rw-r--r-- 1 root root 219 4月 28 03:41 fullback.log
-rwx------ 1 root root 1.2K 4月 28 10:35 fullbackup.sh
-rw------- 1 root root 72K 4月 27 17:59 nohup.out
再次执行磁盘占用统计:
[root@static2 backup]# du -sh *
4.3G ALL_BACKUP-192.168.*.*-260427.tar.gz
4.3G ALL_BACKUP-192.168.*.*-260428.tar.gz
4.0K fullback.log
4.0K fullbackup.sh
72K nohup.out
异常完全消失,两份备份文件逻辑大小、磁盘占用统一为4.3G,一切恢复正常。
二、核心原理:ll与du根本不是一回事
想要弄懂问题,首先要分清两个命令的本质区别,这是Linux基础运维高频误区:
命令 | 统计维度 | 核心含义 |
|---|---|---|
ll / ls -l | 逻辑大小 | 文件内实际写入的数据字节数,只看文件内容本身 |
du -sh | 物理占用 | 文件在磁盘上实际分配的块空间,受文件系统、预分配、稀疏文件影响 |
简单总结:
正常场景下两者差距极小,但在数据库备份、大文件高速写入、文件预分配场景下,差距会被无限放大。
三、XtraBackup空间异常根因
1. XtraBackup备份写入特性
XtraBackup属于热备工具,备份过程会持续读取InnoDB数据文件、redo log、undo log,高速连续写入本地文件。
为了规避磁盘碎片、提升大文件写入性能、保障备份稳定性,文件系统会自动进行连续空间预分配。
简单说:备份刚开始,系统就提前给备份文件预留了一大块连续磁盘空间(本次场景为8G),避免写入过程中频繁申请磁盘块。
2. 压缩完成后空间不会立即回收
备份流程是原生备份写入并且通过tar命令压缩打包。最终压缩完成后,文件真实逻辑数据只有4.3G,但系统预分配的8G物理空间不会主动释放;
另外,nohup后台进程、文件句柄未及时释放,进一步锁住多余空间;Linux文件系统默认延迟回收闲置块,造成空间虚占。
最终表现:文件只写了4.3G数据,却占用了8G物理磁盘。
3. 为什么第二次备份自动恢复?
因此两次备份后,ll和du大小完全一致,异常自愈。
四、方法排查及规避方案
1. 验证逻辑大小&物理块
通过stat命令精准查看文件双维度大小,快速定位问题:
stat 备份文件名称.tar.gz
2. 手动强制释放冗余空间
备份脚本末尾追加两行命令,备份完成后自动回收空洞空间,杜绝虚占:
# 强制落盘刷新缓存
sync
# 清理文件稀疏空洞、释放多余预分配空间
fallocate -d 备份文件.tar.gz3. 脚本优化建议
五、总结
本次空间异常不是备份损坏、磁盘故障、脚本bug,是XtraBackup写入机制+Linux文件系统预分配的正常现象;数据库、大数据等大文件场景,磁盘容量判断务必以du为准;简单追加sync+fallocate命令,即可彻底规避该类隐形空间问题。
因此不要仅凭文件显示大小规划磁盘,数据库备份、快照、稀疏文件都会造成大小偏差。
觉得内容实用,欢迎点赞+收藏,避免用时找不到!
有数据库运维、备份迁移、故障排查问题,欢迎留言交流。