我有一些大的InnoDB数据库,接近1TB。
为了在处理备用存储时释放一些空间,我删除了一些未使用的InnoDB索引,希望它能释放一些空间。
它没有任何东西。
由于它是InnoDB,引擎是否会使用空的分配空间进行进一步的插入和索引?
由于
答案 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服务器。
现在导入这些表,现在每个表都有自己的表空间,这可以缩小删除表的大小。
这些是可行的解决方法:
答案 1 :(得分:1)
如果你不使用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中还有什么?
话虽这么说,您需要迁移数据,删除所有InnoDB中继文件,然后重新加载两件事:
我在2010年10月29日写了如何做到这一点:Howto: Clean a mysql InnoDB storage engine?
展望未来,你可以缩小单个InnoDB表。例如,收缩mydb.mytable:
ALTER TABLE mydb.mytable ENGINE=InnoDB;