MySQL磁盘空间耗尽(表膨胀/日志膨胀)排查与优化全流程

 返回>大型高并发系统中,10大MySQL 生产事故-CSDN博客

一、问题现象

  • ERROR 1030 (HY000): Got error 28 from storage engine。
  • 磁盘空间100%,数据库不可写。
  • binlog、undo log、表文件异常膨胀。

二、根本成因

分类具体原因
表数据过大历史数据未归档
binlog 积压未清理
undo log 积压长事务未提交
临时文件膨胀排序/分组落盘
relay log 堆积主从延迟大
表空间碎片delete 后空间未回收

三、排查步骤

df -h
du -sh /var/lib/mysql/*
du -sh /var/lib/mysql/ib*
du -sh /var/lib/mysql/*.ibd
du -sh /var/lib/mysql/mysql-bin.*
show slave status\G;
show binary logs;
select * from information_schema.innodb_trx where TIME_TO_SEC(TIMEDIFF(now(), trx_started)) > 60;

四、优化方案

1. 清理 binlog

purge binary logs before now() - interval 7 day;

配置自动清理:

binlog_expire_logs_seconds = 604800

2. undo log 优化

  • 提交长事务。
  • innodb_undo_log_truncate = 1 (MySQL 8.0)

3. 表归档与冷热分离

  • 分区表、历史表拆分。

4. 表膨胀收缩

optimize table big_table;

或 dump 重建。

5. relay log 优化

relay_log_purge = 1

6. 临时表与内存优化

tmp_table_size = 512M
max_heap_table_size = 512M

7. 文件系统扩容

  • 临时扩容、挂盘。
  • 清理无关日志。

五、生产示例

  • binlog 清理:

    purge binary logs before now() - interval 3 day;
  • 历史数据归档:

    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;
  • 临时表优化:

    tmp_table_size = 1G

六、监控与预防

监控项工具警戒值
磁盘空间node_exporter>80%
binlog 文件数mysql_exporter>100
undo log 空间information_schema异常增长
临时表磁盘使用Created_tmp_disk_tables异常增大
relay log 空间Relay_Log_Space膨胀告警

七、总结

binlog定时清,undo靠小事务,大表要归档,空间要optimize。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值