什么是我的/ var / lib / mysql目录中的ibdata1文件?

login到我的Webmin控制面板,我注意到几乎所有的磁盘空间都已满。 我search了我系统中十个最大的文件/目录,发现一个名为ibdata1的文件占用了大约94GB的空间。 它驻留在我的/ var / lib / mysql目录中。

ibdata1做什么? 我可以安全地删除它吗? 我的假设是这是某种倾销,但这只是一个疯狂的猜测。

文件ibdata1是InnoDB基础结构的系统表空间。

它包含了几个对InnoDB至关重要的信息类

  • 表数据页面
  • 表索引页面
  • 数据字典
  • MVCC控制数据
    • 撤消空间
    • 回滚段
  • 双写缓冲区(页面写入背景,以避免操作系统caching)
  • 插入缓冲区(更改为二级索引)

请注意ibdata1在InnoDB Universe中的位置(右侧)

InnoDB架构

您可以通过启用innodb_file_per_table将数据和索引页面从ibdata1分离出来。 这将导致任何新创build的InnoDB表将数据和索引页存储在外部.ibd文件中。

  • datadir是/ var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB; ,创build/var/lib/mysql/mydb/mytable.frm
    • 启用innodb_file_per_table,存储在/var/lib/mysql/mydb/mytable.ibd数据/索引页
    • innodb_file_per_table已禁用,数据/索引页面存储在ibdata1中

无论InnoDB表存储在哪里,InnoDB的function都需要查找表元数据并存储和检索MVCC信息,以支持ACID合规性事务隔离

这里是我过去的关于从ibdata1分离表数据和索引的文章

  • Oct 29, 2010我在StackOverflow中的原始文章
  • Nov 26, 2011 : 错误1114(HY000)6308行中的文件&表user_analysis已满
  • Feb 03, 2012 : 计划在MySQL InnoDB中优化表
  • Mar 25, 2012 : 为什么InnoDB将所有数据库存储在一个文件中?
  • Apr 01, 2012 : innodb_file_per_table是可取的吗?

接下来做什么

您可以继续让ibdata1存储所有内容,但是这使得执行LVM快照成为难题(我个人认为)。

您需要使用我的StackOverflow后,并永久收缩该文件。

请运行此查询:

 SELECT ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim FROM (SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes FROM information_schema.tables WHERE engine='InnoDB') A; 

这将告诉您在应用InnoDB清理后可以回收多less浪费的空间。

该文件是ibdata1 ,而不是ibdatal ,它包含了所有的InnoDB数据库。 如果删除它,则会丢失所有数据。

有关如何处理它的一些想法,请参阅如何收缩/清除MySQL中的ibdata1文件 。

如果你使用innodb作为默认的MySQL引擎将把你所有的数据库存储到ibdata1中。 还有日志文件ib_logfile0和ib_logfile1。 不要删除这些文件。