我正在使用带有单个文件配置的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文件包含的表数据旁边有多少数据?
答案 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中有一堆“额外”空间有几个原因,但最可能的情况是:
DELETE
和UPDATE
操作期间保留撤消日志,对于长时间运行的操作,触及许多行可能会变得非常大。同样,如果文件被扩展为保存此数据,则永远不会缩小。如前所述,如果您希望定期删除表并希望恢复磁盘空间,则使用innodb_file_per_table
可以提供帮助。我的博文The basics of InnoDB space file layout可以帮助您了解ibdata1
文件中包含的内容。