首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >诡异!MySQL备份包仅4.3G,磁盘占用却暴涨至8G?

诡异!MySQL备份包仅4.3G,磁盘占用却暴涨至8G?

作者头像
俊才
发布2026-05-08 19:07:08
发布2026-05-08 19:07:08
270
举报
文章被收录于专栏:数据库干货铺数据库干货铺

XtraBackup是生产环境MySQL全量热备的首选工具,无锁备份、支持增量、兼容主流MySQL版本,稳定性拉满。

但近期在生产运维中,遇到了一个非常迷惑的异常现象:

XtraBackup打包压缩后的备份文件,逻辑大小只有4.3G,磁盘实际占用却达到8.0G,磁盘空间莫名被大量占用;隔日再次执行全量备份后,异常自动消失,文件大小、磁盘占用完全匹配。

不少同学第一时间会怀疑:备份文件损坏、磁盘坏道、文件系统故障、脚本异常?

其实全都不是!今天结合真实线上操作日志,带你彻底拆解这个XtraBackup+Linux文件系统的底层隐藏坑。

一、真实现场问题复盘

先还原完整操作日志,百分百复刻生产现场:

1. 首次备份完成

查看备份目录文件列表:

代码语言:javascript
复制
[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统计磁盘实际占用:

代码语言:javascript
复制
[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全量备份:

代码语言:javascript
复制
[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

再次执行磁盘占用统计:

代码语言:javascript
复制
[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

物理占用

文件在磁盘上实际分配的块空间,受文件系统、预分配、稀疏文件影响

简单总结:

  • ll:文件应该有多大
  • du:文件实际占了多少硬盘

正常场景下两者差距极小,但在数据库备份、大文件高速写入、文件预分配场景下,差距会被无限放大。

三、XtraBackup空间异常根因

1. XtraBackup备份写入特性

XtraBackup属于热备工具,备份过程会持续读取InnoDB数据文件、redo log、undo log,高速连续写入本地文件。

为了规避磁盘碎片、提升大文件写入性能、保障备份稳定性,文件系统会自动进行连续空间预分配。

简单说:备份刚开始,系统就提前给备份文件预留了一大块连续磁盘空间(本次场景为8G),避免写入过程中频繁申请磁盘块。

2. 压缩完成后空间不会立即回收

备份流程是原生备份写入并且通过tar命令压缩打包。最终压缩完成后,文件真实逻辑数据只有4.3G,但系统预分配的8G物理空间不会主动释放;

另外,nohup后台进程、文件句柄未及时释放,进一步锁住多余空间;Linux文件系统默认延迟回收闲置块,造成空间虚占。

最终表现:文件只写了4.3G数据,却占用了8G物理磁盘。

3. 为什么第二次备份自动恢复?

  • 新一轮备份任务刷新了系统IO缓存
  • 旧备份文件的进程句柄完全释放
  • 文件系统自动回收闲置、未写入的预分配磁盘块
  • 新备份文件正常按需分配空间,无过度预分配

因此两次备份后,ll和du大小完全一致,异常自愈。

四、方法排查及规避方案

1. 验证逻辑大小&物理块

通过stat命令精准查看文件双维度大小,快速定位问题:

代码语言:javascript
复制
stat 备份文件名称.tar.gz
  • 大小(size):ll展示的逻辑数据大小
  • 块(Blocks):du统计的磁盘物理块占用

2. 手动强制释放冗余空间

备份脚本末尾追加两行命令,备份完成后自动回收空洞空间,杜绝虚占:

代码语言:javascript
复制
# 强制落盘刷新缓存
sync
# 清理文件稀疏空洞、释放多余预分配空间
fallocate -d 备份文件.tar.gz

3. 脚本优化建议

  • 备份完成后主动结束后台nohup进程,释放文件句柄
  • 定时清理历史过期备份,减少磁盘碎片堆积
  • 备份目录预留2倍数据库实际容量,规避预分配导致的空间不足告警
  • 监控磁盘优先使用du真实占用,不要以ll逻辑大小作为容量判断依据

五、总结

本次空间异常不是备份损坏、磁盘故障、脚本bug,是XtraBackup写入机制+Linux文件系统预分配的正常现象;数据库、大数据等大文件场景,磁盘容量判断务必以du为准;简单追加sync+fallocate命令,即可彻底规避该类隐形空间问题。

因此不要仅凭文件显示大小规划磁盘,数据库备份、快照、稀疏文件都会造成大小偏差。

觉得内容实用,欢迎点赞+收藏,避免用时找不到!

有数据库运维、备份迁移、故障排查问题,欢迎留言交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库干货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档