3

我有一些大型 InnoDB 数据库,接近 1TB。

为了在使用替代存储时释放一些空间,我删除了一些未使用的 InnoDB 索引,希望它可以释放一些空间。

它什么也没释放。

由于它是 InnoDB,引擎会使用分配的空空间进行进一步的插入和索引吗?

4

3 回答 3

1

在这里回答:https ://stackoverflow.com/a/8932289/82114

如果您不使用 innodb_file_per_table,则可以回收磁盘空间,但非常乏味,并且需要大量停机时间。

“如何”可以在这里找到:http: //dev.mysql.com/doc/refman/5.6/en/innodb-data-log-reconfiguration.html

请务必在转储中保留架构的副本。

目前,您无法从系统表空间中删除数据文件。要减小系统表空间大小,请使用以下过程:

使用 mysqldump 转储所有 InnoDB 表。

停止服务器。

删除所有现有的表空间文件,包括 ibdata 和 ib_log 文件。如果要保留信息的备份副本,请在删除 MySQL 安装中的文件之前将所有 ib* 文件复制到另一个位置。

删除 InnoDB 表的任何 .frm 文件。

配置一个新的表空间。

重新启动服务器。

导入转储文件。

于 2013-09-04T21:11:14.673 回答
1

InnoDB 将数据存储在表空间中。默认情况下,只有一个表空间,所有数据库的数据都存储在一个文件中。该文件中包含数据字典、表和索引。有一个全局参数innodb_data_file_path定义了这个表空间文件。它的语法类似于ibdata1:256M:autoextend,这意味着在开始时将创建一个大小为 256 MB 的文件,然后每当数据大小超过此大小时,该文件将自动扩展。该innodb_autoextend_increment变量以 MB 为单位定义每个增量应该是多少。

您将如何获得您的索引空间?

您应该首先备份所有 InnoDB 表并更改my.ini/my.cnfas中的设置innodb_file_per_table并重新启动 MySQL 服务器。现在导入这些表,现在每个表都有自己的表空间,可以在删除表时缩小大小。

这些是可能的解决方法:

  • 每个表单独文件:InnoDB 提供了这个选项,其中每个表的数据(数据 + 索引)可以通过全局变量 innodb_file_per_table 存储在单独的文件中。
  • 固定表空间大小:解决表空间文件大小问题的一种方法是将表空间大小(删除自动扩展)固定为外推值。所以,当你达到极限时,你就知道是时候清理了。
  • 迁移到 MyISAM:对于所有您认为数据对事务等不是那么重要的表(甚至数据库),将它们迁移到 MyISAM。
于 2012-08-01T05:10:23.113 回答
0

您应该重新组织 InnoDB 基础架构。为什么?因为 ibdata1 从不缩小。禁用innodb_file_per_table后,它会迅速膨胀ibdata1吗?除了数据和索引,ibdata1 中还有什么?

  • 数据字典
  • 双写缓冲区(处理后台页面写入)
  • 插入缓冲区(andles 对二级索引的更改)
  • 回滚段
  • 撤消表空间

话虽如此,您需要将数据迁移出去,删除所有 InnoDB 中继文件,然后重新加载两件事:

  • 已启用 innodb_file_per_table
  • 更大的事务日志

我在 2010 年 10 月 29 日写了如何做到这一点:Howto: Clean a mysql InnoDB storage engine?

展望未来,您可以缩小单个 InnoDB 表。例如,要缩小 mydb.mytable:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
于 2012-08-15T15:14:33.527 回答