我有一个使用InnoDB存储引擎的MySQL表;它包含大约2M数据行。当我从表中删除数据行时,它没有释放分配的磁盘空间。运行该optimize table
命令后,ibdata1文件的大小也没有减小。
有什么办法可以从MySQL回收磁盘空间?
我处境很糟;该应用程序在大约50个不同的位置运行,现在几乎所有位置都出现磁盘空间不足的问题。
innodb_file_per_table
的电源已关闭。好消息是,此选项on
在MySQL的最新版本中默认为。
我有一个使用InnoDB存储引擎的MySQL表;它包含大约2M数据行。当我从表中删除数据行时,它没有释放分配的磁盘空间。运行该optimize table
命令后,ibdata1文件的大小也没有减小。
有什么办法可以从MySQL回收磁盘空间?
我处境很糟;该应用程序在大约50个不同的位置运行,现在几乎所有位置都出现磁盘空间不足的问题。
innodb_file_per_table
的电源已关闭。好消息是,此选项on
在MySQL的最新版本中默认为。
Answers:
MySQL不会减小ibdata1的大小。曾经 即使您optimize table
用来从已删除的记录中释放已使用的空间,它也会在以后重用。
一种替代方法是配置服务器以使用innodb_file_per_table
,但这将需要备份,删除数据库并还原。积极的一面是该表的.ibd文件在optimize table
。之后被减少。
ALTER TABLE t ENGINE=INNODB
在现有表上运行。 ” 这意味着您可以打开此功能,使用ALTER TABLE命令“转换”现有表以使用单独的InnoDB文件,然后优化表以缩小其大小。但是,一旦完成,就必须弄清楚如何删除(巨大的)源InnoDB文件……
我自己也遇到了同样的问题。
发生的是,即使删除数据库,innodb仍不会释放磁盘空间。我必须导出,停止mysql,手动删除文件,启动mysql,创建数据库和用户,然后导入。谢天谢地,我只有200MB的行,但它保留了250GB的innodb文件。
设计失败。
如果您不使用innodb_file_per_table,则可以回收磁盘空间,但是非常繁琐,并且需要大量的停机时间。
“操作方法”非常深入-但我在下面粘贴了相关部分。
确保在转储中还保留架构的副本。
当前,您不能从系统表空间中删除数据文件。要减小系统表空间大小,请使用以下过程:
使用mysqldump转储所有InnoDB表。
停止服务器。
除去所有现有的表空间文件,包括ibdata和ib_log文件。如果要保留信息的备份副本,则在删除MySQL安装中的文件之前,将所有ib *文件复制到另一个位置。
删除InnoDB表的所有.frm文件。
配置一个新的表空间。
重新启动服务器。
导入转储文件。
解决空间回收问题的另一种方法是,在表中创建多个分区-基于范围的分区,基于值的分区,然后删除/截断该分区以回收空间,这将释放存储在特定分区中的整个数据所使用的空间。
当您为表引入分区时,表架构将需要一些更改,例如-唯一键,包含分区列的索引等。
一年前,我在mysql5.7版本上也遇到了同样的问题,而ibdata1占用了150 Gb。所以我添加了撤消表空间
进行Mysqldump备份
停止mysql服务
从data dir中删除所有数据
在当前my.cnf中的undo tablespace参数下面添加
#undo tablespace
innodb_undo_directory = /var/lib/mysql/
innodb_rollback_segments = 128
innodb_undo_tablespaces = 3
innodb_undo_logs = 128
innodb_max_undo_log_size=1G
innodb_undo_log_truncate = ON
启动mysql服务
存储mysqldump备份
问题解决了!
从MySQL Inodb引擎的表中删除数据后,有几种回收磁盘空间的方法
如果您从一开始就不使用innodb_file_per_table,那么转储所有数据,删除所有文件,重新创建数据库并再次导入数据是唯一的方法(请检查上面FlipMcF的答案)
如果您使用的是innodb_file_per_table,则可以尝试