服务公告
数据库文件比备份大很多:碎片与二进制日志占位
发布时间:2026-10-16 11:40
## 现象是什么 mysqldump 导出的备份文件两 G,数据库的数据目录却占了二十 G,差出十倍,新手第一反应是"备份漏了数据"。先安心:多数情况下数据没丢,差值来自两块正常的占位——InnoDB 的存储碎片与二进制日志。另有小头来自回滚段与临时表空间,同样属于正常占位,不必恐慌性处理。理解这两个概念,文件体积的问题就能自己解释。 ## 碎片的原理 InnoDB 按页存储,删除与更新会在页内留下空洞:数据删了,页的空间不自动归还操作系统,新数据优先填别的页。长期高写入高删除的表(日志表、会话表、队列表),碎片率可以很高——文件很大,实际有效数据占比很小。看一张表的碎片情况: ```sql SHOW TABLE STATUS LIKE 'log_records'; ``` Data_free 列就是可回收空间。压缩的办法是重建表:OPTIMIZE TABLE 或者 ALTER TABLE ... ENGINE=InnoDB 触发重建,锁表时间与表大小相关,大表安排低峰或用在线变更工具。重建期间还需要额外磁盘空间,空间紧张的机器先估算,别优化不成反把盘撑满。 ## 二进制日志的占位 binlog 记录所有变更用于复制与恢复,持续增长是它的本职。文件大不等于有问题,但没有过期策略它就无限涨。控制它的两个参数: ``` binlog_expire_logs_seconds = 604800 ``` 按业务保留需求设定天数,自动清理过期日志。有从库的实例注意:清理策略要考虑从库是否已读取,否则复制会断。手动清理用 PURGE BINARY LOGS 指定时间点之前的日志。binlog 既是占位也是恢复手段,清理策略要在两者之间取平衡。 ## 判断与建议 差值多少算正常没有定数,看趋势比看绝对值有用:数据目录体积与备份体积的比值长期稳定,属于该库的正常形态;比值持续攀升,说明碎片在累积或 binlog 策略缺失。把数据目录、备份体积、binlog 体积三个数字纳入监控,顺云控制台的磁盘曲线看总量,脚本定期记录细分值,容量规划就不会被表面的"大文件"吓到。把碎片率与 binlog 体积写进周报,趋势异常时能追溯到具体变更。下一篇: 数据导出指引发布