数据库磁盘爆满?高效清理无用数据方案
数据库磁盘爆满常见原因与诊断
数据库磁盘空间耗尽时,通常表现为写入失败、查询异常或告警触发。常见原因包括:
- 应用日志或错误日志无限制增长
- binlog、undo log、redo log未能及时清理
- 大量临时表或历史数据未被归档
- 索引碎片过多占用额外空间
诊断时建议先执行以下命令确认空间分布:
- MySQL:
SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS 'Size (MB)' FROM information_schema.TABLES ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC LIMIT 20; - 通用检查: 查看数据目录大小(如
du -sh /var/lib/mysql)以及日志文件位置(如/var/log/mysql/)
无用数据清理核心步骤
1. 清理日志与临时表
对于MySQL,可执行 PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY; 清理过期binlog,并设置 expire_logs_days 或 binlog_expire_logs_seconds 参数。同时检查 general_log、slow_query_log 等日志文件,使用 TRUNCATE mysql.slow_log; 或直接删除文件后重启。
2. 归档历史数据
对于业务大表,按时间分区或分表,将超过保留期的数据导出压缩后删除。示例:
CREATE TABLE orders_archive LIKE orders;
INSERT INTO orders_archive SELECT * FROM orders WHERE create_time < '2023-01-01';
DELETE FROM orders WHERE create_time < '2023-01-01';
OPTIMIZE TABLE orders;3. 重建索引与碎片整理
频繁增删改会产生碎片,使用 OPTIMIZE TABLE table_name; 可在线回收空间(建议业务低峰期执行)。对于无法直接OPTIMIZE的场景,可改为 ALTER TABLE table_name ENGINE=InnoDB;
4. 其他空间回收
- undo表空间: MySQL 8.0默认自动收缩,若显式设置
innodb_undo_log_truncate=ON可加快回收。 - 临时表空间: 检查
ibtmp1文件大小,重启实例或调整参数innodb_temp_data_file_path。 - 系统表空间: 移除无用的
INFORMATION_SCHEMA或PERFORMANCE_SCHEMA表(一般不建议更改)。
清理注意事项
- 备份先行:任何删除或修改前务必全量备份或至少导出待清理数据。
- 验证业务影响:确认清理逻辑不会中断正在运行的事务或锁表。
- 磁盘扩容预案:如果清理后空间仍不足,需优先扩容或迁移。
- 监控与自动化:建议配置磁盘使用率告警,并编写定期清理脚本(如使用
pt-archiver或自维护定时任务)。
结语
数据库磁盘爆满时,按以上步骤从日志、历史数据、碎片等方面逐步排查清理,通常能快速恢复可用空间。建议运维团队建立日常空间巡检与自动化清理机制,避免问题反复出现。