与InnoDB的,我怎么能索回索引空间?(With InnoDB, how can I claim

2019-09-20 13:53发布

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

为了腾出一些空间上的备用存储工作时,我删除了一些不使用的InnoDB的指标,希望它会释放一些空间。

它释放什么。

由于这是InnoDB中,将发动机用于进一步的插入和索引空分配的空间?

谢谢

Answer 1:

在表空间的InnoDB存储数据。 默认情况下,有一个单独的表空间,并且所有数据库的数据存储在一个文件中。 这个文件有数据字典表,以及在它的索引。 有一个全局参数innodb_data_file_path定义此表空间文件。 它就像一个语法ibdata1:256M:autoextend ,这意味着在开始大小为256 MB将被创建,然后每当数据大小超过这一点,该文件将自动扩展的文件。 该innodb_autoextend_increment变量以MB为单位的,通过每个增量应该是多少定义。

怎么你会得到你的索引空间?

你应该先备份所有InnoDB表和更改设置my.ini/my.cnfinnodb_file_per_table ,并重新启动MySQL服务器。 现在,导入这些表现在每个表都会有它自己的表空间,可以在删除表缩小尺寸。

这些是可能的解决方法:

  • 每表单独的文件:InnoDB提供该选项,其中数据(数据+索引)为每个表可以通过一个全局变量innodb_file_per_table被存储在一个单独的文件中。
  • 固定表空间大小:一种方法来解决与该表空间文件大小的问题是修复表空间大小(除去自动扩展)到外推值。 所以,当你打了极限,你知道是时候清理。
  • 移动到的MyISAM:对于所有的表(甚至数据库)中,你觉得数据不是关键的是具有交易等,将其移动到的MyISAM。


Answer 2:

答案在这里: 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安装在删除文件之前。

删除所有.FRM文件InnoDB表。

配置新的表空间。

重新启动服务器。

导入转储文件。



Answer 3:

你应该重新组织InnoDB的基础设施。 为什么? 由于ibdata1中永远不会收缩。 随着innodb_file_per_table禁用,将在匆忙臃肿ibdata1中? 除了数据和索引,什么住在ibdata1中?

  • 数据字典
  • 双写缓冲(处理背景页写入)
  • 插入缓冲(andles更改辅助索引)
  • 回滚段
  • 撤销表空间

话虽这么说,你需要迁移的数据出来,删除所有InnoDB的传递文件,并与两件事情重装:

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

我写了如何做到这一点回到2010年10月29日: HOWTO:清洁MySQL的InnoDB存储引擎?

展望未来,你可以alwsy收缩个人InnoDB表。 例如,缩小mydb.mytable:

ALTER TABLE mydb.mytable ENGINE=InnoDB;


文章来源: With InnoDB, how can I claim back index space?