使用InnoDB,我如何声明索引空间?

时间:2012-08-01 02:28:27

标签: mysql indexing innodb diskspace

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

为了在处理备用存储时释放一些空间,我删除了一些未使用的InnoDB索引,希望它能释放一些空间。

它没有任何东西。

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

由于

3 个答案:

答案 0 :(得分:1)

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

如何获得指数空间?

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

这些是可行的解决方法:

  • 每个表的单独文件:InnoDB提供此选项,其中每个表的数据(数据+索引)可以通过全局变量innodb_file_per_table存储在单独的文件中。
  • 修复了表空间大小:解决表空间文件大小问题的一种方法是将表空间大小(删除自动扩展)修复为外推值。所以,当你达到极限时,你知道是时候清理了。
  • 转移到MyISAM:对于所有表格(甚至是数据库),您认为数据对于交易等并不重要,请将它们移至MyISAM。

答案 1 :(得分: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文件。如果要保留信息的备份副本,   然后在删除之前将所有ib *文件复制到另一个位置   MySQL安装中的文件。

     

删除InnoDB表的所有.frm文件。

     

配置新的表空间。

     

重启服务器。

     

导入转储文件。

答案 2 :(得分: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;