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

Jam*_*mes 40 mysql maintenance troubleshooting ubuntu-12.04

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

ibdata1 有什么作用?我可以安全地删除它吗?我的假设是它是某种垃圾,但这只是一个疯狂的猜测。

Rol*_*DBA 42

该文件ibdata1是 InnoDB 基础设施的系统表空间。

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

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

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

InnoDB 架构

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

例子

  • 数据目录是/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 快照变得非常苦差事(我个人的意见)。

您需要使用我的 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;
Run Code Online (Sandbox Code Playgroud)

这将说明在应用 InnoDB Cleanup 后可以回收多少浪费的空间。

  • 它为我返回 91.25350952148438 作为“SpaceToReclaim”。这是以兆字节为单位吗?百分?字节? (9认同)
  • 我知道这太旧了。但是对于遇到此问题的任何人,您需要将数字“94”替换为以 GB 为单位的“ibdata1”文件的大小,并且“SpaceToReclaim”将为您提供以 GB 为单位的大小。 (2认同)

Mic*_*ton 9

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

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