我使用的是InnoDB数据库,只有一个文件配置(在/var中),所以没有innodb_file_per_table。
在MySql工作台中,当我查询使用空间的数据库时,使用此查询
SELECT table_schema "Database", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB"
FROM information_schema.TABLES GROUP BY table_schema;它说我有47 GB的数据。然而,ibdata1的大小是99 GB.
我知道ibdata1包含了许多其他的东西,比如表索引、MVCC (多版本控制并发控制)数据和表元数据
,所以我的问题是:,据说52 GB的ibdata1是medatada和其他一些东西,这是正常的吗?通常,ibdata1文件应该包含多少表数据?
发布于 2013-01-07 15:36:55
不,有那么多元数据是不正常的。不过,如果不使用innodb_file_per_table,那么ibdata文件的大小就会变得非常大,这是很正常的。
当数据库增长时,ibdata文件将增长,但实际上它不会缩小。
因此,例如,如果您曾经有130 GB的数据,并删除了其中的一堆数据,那么在清除数据之后,ibdata文件仍然是130 GB。它将只有一堆“空闲空间”,然后它将用于后续插入。
至于缩小文件,除了清除数据库和恢复数据库之外,没有什么可做的。这个答案对如何做到这一点有一些很好的说明。
您还可以考虑使用innodb_file_per_table从表中删除数据,然后优化该表实际上会缩小单个表文件的大小。
发布于 2013-01-07 21:17:17
在ibdata1中拥有大量“额外”空间有几个原因,但最有可能的情况是:
DELETE和UPDATE操作期间保存的,对于非常长时间运行的操作,接触许多行的操作可能会变得相当大。同样,如果文件被展开以保存此数据,它将永远不会收缩。如前所述,如果您希望定期删除表并希望返回磁盘空间,那么使用innodb_file_per_table可以在这方面有所帮助。我的博客文章InnoDB空间文件布局的基础可能会帮助您理解ibdata1文件中包含的内容。
https://stackoverflow.com/questions/14198923
复制相似问题