mysql如何解决Disk full磁盘空间不足_mysql日志与临时文件清理

5次阅读

mysql如何解决Disk full磁盘空间不足_mysql日志与临时文件清理

mysql报错 Error 3OS error code 28: No space left on device 怎么快速定位

这不是 MySQL 自己爆的错,是操作系统拒绝写入后透出的信号。优先查磁盘,不是查 MySQL 配置。

  • 立刻执行 df -h,重点看 /var/lib/mysql 所在分区(常见是 //var)是否 100% 满
  • 再跑 df -i,确认是不是 inode 耗尽——尤其当小文件极多(比如 binlog 日志碎片、临时表)时容易中招
  • 别只盯着 ibdata1 或表文件;mysql-bin.*mysql-relay-bin.*/tmp 下的临时文件、甚至慢查询日志都可能撑爆磁盘

清理 binlog 日志前必须确认的三件事

删 binlog 不是删普通日志,它关系到主从同步和 PITR(基于时间点恢复)。误删会导致从库中断或无法回滚。

  • 先用 SHOW MASTER LOGS; 看当前活跃日志列表,记下 File 最后一个文件名(如 mysql-bin.000123
  • 如果开了主从,必须确认所有从库的 Relay_Master_Log_File(查 SHOW SLAVE STATUSG)没超过你要删的范围
  • 生产环境别用 PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00' 这种模糊方式;优先用 PURGE BINARY LOGS TO 'mysql-bin.000100',精确到文件名更安全

tmpdirinnodb_tmpdir 占满怎么办

大排序、大 join、GROUP BY、CREATE table AS select 都会在临时目录生成巨型文件,且默认不自动清理。

  • 查当前设置:SELECT @@tmpdir, @@innodb_tmpdir;;多数情况指向系统 /tmp,而它常是内存挂载(tmpfs),大小受限于 RAM
  • 临时救急:重启 MySQL 前把 tmpdir 改到空间充足的分区,例如 tmpdir = /data/mysql-tmp,并确保 MySQL 用户有读写权限
  • 长期建议:调低 sort_buffer_sizejoin_buffer_size(别设成几 G),避免单个查询吃光 tmpdir;对大表操作,加 ORDER BYGROUP BY 字段上建索引,减少磁盘临时表生成

哪些日志可以安全关,哪些必须留但要轮转

MySQL 默认不开太多日志,但 dba 手动开的往往忘了收口。关键不是“全关”,而是“可控”。

  • 可关(若无审计/排查需求):general_log = OFF(通用日志)、slow_query_log = OFF(除非正在定位慢 SQL)
  • 必留但需轮转:log_error 错误日志——用 logrotate 配置按天切割 + 压缩 + 保留 7 天,避免单个文件超 GB
  • 危险操作:log_bin = OFF 不能随便关,否则主从、GTID、闪回都失效;如真要关,务必提前停写、备份、评估 RPO

最常被忽略的是 relay log 清理策略。从库上 relay_log_purge = ON 是默认值,但如果从库延迟高、又手动停过 SQL_THREAD,relay log 可能积数 GB 且不会自动删——这时得手工 RESET SLAVE(注意:会清空复制坐标,仅限确定不再需要该从库时用)。

text=ZqhQzanResources