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


32

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

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

Answers:


38

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

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

  • 表格数据页
  • 表索引页
  • 数据字典
  • MVCC控制数据
    • 撤消空间
    • 回滚段
  • 双重写入缓冲区(在后台写页面以避免操作系统缓存)
  • 插入缓冲区(对二级索引的更改)

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

InnoDB架构

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

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

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

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

接下来做什么

您可以继续让ibdata1存储所有内容,但这会使LVM快照真正繁琐(我个人认为)。

您需要使用My 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清理后可以回收多少浪费的空间。


感谢您的输入。此后,我的磁盘配额已用完-在我根据您的帖子中的任何建议采取行动之前,我是否需要可用空间?我注意到您在SO上的原始文章提到执行SQL转储,但这大概会创建一个〜90GB的文件而无处可去。
詹姆斯

mysqldump将仅逻辑表示数据页,而不是索引。您将需要另一个磁盘安装(也许是远程服务器)来转储数据。
RolandoMySQLDBA 2013年

9
它为我返回91.25350952148438 SpaceToReclaim。这是兆字节吗?百分?字节?
以撒2014年

我知道这太旧了。但是,对于任何遇到此问题的人,您都需要94ibdata1文件大小(以GB 为单位)替换该数字,这样SpaceToReclaim就会给您以GB为单位的大小。
anupsabraham


2

如果您将innodb用作MySQL引擎,则默认情况下会将所有数据库存储到ibdata1中。另外还有日志文件ib_logfile0和ib_logfile1。不要删除这些文件。


什么是删除服务器上的文件?
弗兰克(Frank)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.