首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有了InnoDB,我如何才能恢复索引空间?

有了InnoDB,我如何才能恢复索引空间?
EN

Stack Overflow用户
提问于 2012-08-01 02:28:26
回答 3查看 6.9K关注 0票数 3

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

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

它没有释放任何东西。

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

EN

回答 3

Stack Overflow用户

发布于 2012-08-01 05:10:23

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
EN

Stack Overflow用户

发布于 2013-09-04 21:11:14

答: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*文件复制到另一个位置。 删除.frm表的任何InnoDB文件。 配置新的表空间。 重新启动服务器。 导入转储文件。

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 15:14:33

您应该重新组织InnoDB基础设施。为什么?因为ibdata1从不收缩。在innodb被禁用后,它会在匆忙中膨胀ibdata1吗?除了数据和索引之外,ibdata1中还有什么?

  • 数据字典
  • 双写缓冲区(处理后台页面写入)
  • 插入缓冲区(并将更改为辅助索引)
  • 回滚段
  • 撤消表空间

尽管如此,您需要迁移您的数据,删除所有InnoDB中继文件,并用两件事重新加载:

  • innodb_file_per_table已启用
  • 较大事务日志

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

接下来,您可以很好地缩小单个InnoDB表。例如,要收缩mydb.mytable:

代码语言:javascript
复制
ALTER TABLE mydb.mytable ENGINE=InnoDB;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11751792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档