ibdata1有多少空间是元数据?

时间:2013-01-07 15:30:02

标签: mysql database innodb

我正在使用带有单个文件配置的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文件包含的表数据旁边有多少数据?

2 个答案:

答案 0 :(得分:2)

不,你会拥有那么多的元数据是不正常的。如果您没有使用innodb_file_per_table,那么ibdata文件可能会变得荒谬,这是正常的。

当您的数据库增长时,您的ibdata文件将会增长,但它永远不会实际缩小。

因此,例如,如果您在一个点上有130 GB的数据并删除了一堆数据,那么在清除数据后ibdata文件仍然是130 GB。它只会有一堆“自由空间”,然后用于后续插入。

至于缩小文件,除了擦除数据库并恢复它之外,你真的没有什么可做的。这个答案对如何做到这一点有一些很好的指导。

Howto: Clean a mysql InnoDB storage engine?

您还可以考虑使用innodb_file_per_table删除表中的数据,稍后优化该表实际上会缩小单个表文件的大小

答案 1 :(得分:2)

在ibdata1中有一堆“额外”空间有几个原因,但最可能的情况是:

  • 您过去删除了大量数据。当您删除行或删除表时,虽然文件中将提供可用空间,但文件本身永远不会缩小。
  • 您可能拥有过多的撤消日志空间(或者在过去的某个时刻)。在DELETEUPDATE操作期间保留撤消日志,对于长时间运行的操作,触及许多行可能会变得非常大。同样,如果文件被扩展为保存此数据,则永远不会缩小。

如前所述,如果您希望定期删除表并希望恢复磁盘空间,则使用innodb_file_per_table可以提供帮助。我的博文The basics of InnoDB space file layout可以帮助您了解ibdata1文件中包含的内容。