首页 文章

MySQL InnoDB在从表中删除数据行后没有释放磁盘空间

提问于
浏览
115

我有一个使用InnoDB存储引擎的MySQL表;它包含大约2M个数据行 . 当我从表中删除数据行时,它没有释放分配的磁盘空间 . 运行 optimize table 命令后,ibdata1文件的大小也没有减少 .

有没有办法从MySQL回收磁盘空间?

我情况很糟糕;这个应用程序在大约50个不同的位置运行,现在几乎所有这些都出现了磁盘空间不足的问题 .

5 回答

  • 123

    MySQL不会减小ibdata1的大小 . 永远 . 即使您使用 optimize table 释放已删除记录中使用的空间,它也会在以后重用它 .

    另一种方法是将服务器配置为使用innodb_file_per_table,但这需要备份,删除数据库和还原 . 积极的一面是,在 optimize table 之后,表的.ibd文件会减少 .

  • 32

    我自己也遇到了同样的问题 .

    会发生什么,即使你删除数据库,innodb仍然不会释放磁盘空间 . 我不得不导出,停止mysql,手动删除文件,启动mysql,创建数据库和用户,然后导入 . 感谢上帝,我只有200MB的行,但它没有250GB的innodb文件 .

    Fail by design.

  • 0

    如果您不使用innodb_file_per_table,可以回收磁盘空间,但相当繁琐,并且需要大量的停机时间 .

    How To非常深入 - 但我粘贴了下面的相关部分 .

    确保还在转储中保留模式的副本 .

    目前,您无法从系统表空间中删除数据文件 . 要减小系统表空间大小,请使用以下过程:使用mysqldump转储所有InnoDB表 . 停止服务器 . 删除所有现有的表空间文件,包括ibdata和ib_log文件 . 如果要保留信息的备份副本,请在删除MySQL安装中的文件之前将所有ib *文件复制到另一个位置 . 删除InnoDB表的任何.frm文件 . 配置新的表空间 . 重启服务器 . 导入转储文件 .

  • -1

    解决空间回收问题的其他方法是,在表中创建多个分区 - 基于范围,基于值的分区,只需删除/截断分区以回收空间,这将释放存储在特定分区中的整个数据所使用的空间 .

    当您为表引入分区时,表模式中需要进行一些更改,例如 - 唯一键,包含分区列的索引等 .

  • 21

    从MySQL Inodb引擎的表中删除数据后,有几种方法可以回收磁盘空间

    如果您从一开始就不使用innodb_file_per_table,那么转储所有数据,删除所有文件,重新创建数据库并再次导入数据只是方法(检查上面FlipMcF的答案)

    如果您使用innodb_file_per_table,您可以尝试

    • 如果可以删除所有数据truncate命令将删除数据并为您回收磁盘空间 .

    • Alter table命令将删除并重新创建表,以便它可以回收磁盘空间 . 因此在删除数据之后,运行alter table,不改变任何东西来释放硬盘(即:表TBL_A有charset uf8,删除数据后运行ALTER TABLE TBL_A charset utf8 - >这个命令不会改变你的表但是它让mysql重新创建你的表并重新获得磁盘空间

    • 创建TBL_B,如TBL_A . 将要保留的选择数据从TBL_A插入TBL_B . 删除TBL_A,并将TBL_B重命名为TBL_A . 如果TBL_A和需要删除的数据很大(MySQL innodb中的删除命令性能非常差),这种方式非常有效

相关问题