如何解决MySQL空间不足的问题?

轻浩小哥_5480

轻浩小哥_5480

2026-07-31

918人浏览

原创

先执行lsof +l1查被删除但进程仍在写入的“幽灵文件”,再根据文件类型选择kill进程、重启服务或安全清理;df与du差异主因是文件系统统计逻辑不同,非磁盘真满。

如何解决mysql空间不足的问题?

df -h 显示 100% 但 du 总和远小于此,怎么破?

这不是磁盘真满了,而是“幽灵文件”在作祟:进程还在写某个已被删除的文件(比如没退出的 mysqldump、卡住的 binlog 写入),df 统计了已删但未释放的空间,du 却看不见它。

  • 立刻执行 lsof +L1,找出状态为 deleted 的大文件,重点关注 /var/lib/mysql/ 下的 #sql_*、ibtmp1、mysql-bin.*
  • 确认无活跃 mysqld 进程(ps aux | grep mysqld),再清理:sudo find /var/lib/mysql -name "#sql_*" -mmin +30 -delete
  • ibtmp1 占用大且 MySQL ≥ 5.7.30?可用 ALTER TABLESPACE innodb_temp_tablespaces ENCRYPTION='N'; 触发释放;否则必须停服务后手动删

PURGE BINARY LOGS 后主从断了,为什么?

盲目清 binlog 是最常踩的坑——PURGE 不看从库进度,直接删掉从库还没读完的日志,主从立刻失联。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 先查从库状态:SHOW SLAVE STATUS\G,记下 Relay_Master_Log_File 和 Exec_Master_Log_Pos
  • 再查当前 binlog 列表:SHOW BINARY LOGS;,确保你要 PURGE 的文件名早于 Relay_Master_Log_File
  • 安全命令只用时间锚点:PURGE BINARY LOGS BEFORE '2026-06-25 00:00:00';(比当前时间早 1 天)
  • 长期预防:在 my.cnf 中设 expire_logs_days = 3,并验证生效:SELECT @@expire_logs_days;

DELETE 了 90% 数据,.ibd 文件大小纹丝不动

InnoDB 设计上就不把已删行的空间还给文件系统,这是正常行为,不是 bug。不干预的话,空间永远卡在峰值。

  • 确认 innodb_file_per_table = ON(默认开启),否则所有表共用 ibdata1,删表也无效
  • 线上表可执行 ALTER TABLE t1 ENGINE=InnoDB;,效果同 OPTIMIZE TABLE,语义更清晰
  • 若表太大不敢锁,且业务不能停写,别硬扛:用 pt-online-schema-change 或导出+DROP+重建(务必提前停写或加锁)
  • TRUNCATE TABLE 比 DELETE FROM 快得多,且立即释放空间,但不可回滚、重置自增 ID

安装 MySQL 失败报 “No space left on device”,但 df -h / 显示还有 50GB

90% 的情况是卡在 /tmp 或 /var/tmp 上——这两个目录常为 tmpfs(内存挂载),大小仅 RAM/2 或固定 2–4GB,而 MySQL 初始化需 3–8GB 临时空间。

  • 定位瓶颈:df -h | grep -E '(tmp|var)' 看真实使用率;ls -ld /tmp 确认是否 tmpfs
  • 绕过限制:安装前设环境变量 TMPDIR=/data/tmp;APT 安装用 sudo apt -o DPkg::Install::TempDir=/data/tmp install mysql-server
  • 安装完成后立刻改配置:在 [mysqld] 段加 datadir = /data/mysql 和 tmpdir = /data/mysql-tmp,同步权限与 SELinux 上下文
真正容易被忽略的是:read_only=0 只是开关,不是解药;OPTIMIZE TABLE 在大表上会锁表;/tmp 是内存盘这件事,很多人直到重装三次才意识到。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2133

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1319

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

755

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2892

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4848

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1099

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5111

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4522

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5934

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 181人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 289人学习