欢迎光临
我们一直在努力

mysql表占用的磁盘空间不释放

目录

  • 一、原因分析
    • InnoDB 存储引擎特性
    • 130G空间未释放的直接原因
  • 二、空间回收方案
    • 方案一:OPTIMIZE TABLE(推荐,Online DDL)
    • 方案二:ALTER TABLE(更灵活的Online方式)
    • 方案三:创建新表替换(最稳妥,可控制)
    • 方案四:导出导入(极端情况)
  • 三、操作前必做检查
    • 重要注意事项
    • 快速决策建议

这是MySQL中非常常见的问题。删除数据后空间不释放,根本原因在于MySQL的存储引擎机制。

一、原因分析

InnoDB 存储引擎特性

MySQL 5.7默认使用InnoDB引擎,它采用**表空间(Tablespace)**方式存储数据:

  • 数据页(Page)复用机制:删除数据只是标记为\”已删除\”,数据页变为空闲状态,但这些空间仍属于该表,不会自动归还给操作系统
  • B+树结构:InnoDB使用B+树索引,删除数据后树节点可能碎片化,但表文件(.ibd)大小不变
  • 共享表空间 vs 独立表空间:
    • 如果 innodb_file_per_table = OFF:数据存在共享表空间 ibdata1 中,永远无法缩小
    • 如果 innodb_file_per_table = ON(5.6+默认):每个表有独立的 .ibd 文件,可以回收
  • 130G空间未释放的直接原因

    • 删除操作只更新了元数据和标记删除位,.ibd 文件物理大小不变
    • 这些空间被InnoDB标记为\”可重用\”,后续INSERT操作会优先使用,但操作系统层面看文件还是130G

    二、空间回收方案

    方案一:OPTIMIZE TABLE(推荐,Online DDL)

    — 查看当前表使用的引擎和大小
    SHOW TABLE STATUS FROM prd2_sphmdm LIKE \’api_logs\’;

    — 执行优化(MySQL 5.7支持Online DDL,期间允许DML操作)
    OPTIMIZE TABLE prd2_sphmdm.api_logs;

    特点:

    • 重建表结构,整理碎片,回收未使用空间
    • 5.7版本支持Online DDL,但会短暂锁表(最后阶段)
    • 需要额外磁盘空间(约130G)用于重建过程

    方案二:ALTER TABLE(更灵活的Online方式)

    赞(0)
    未经允许不得转载:171主机测评 » mysql表占用的磁盘空间不释放
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址