接下来做什么

接下来做什么

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

ibdata1 有什么用?我可以安全地删除它吗?我的假设是它是某种转储,但这只是猜测。

答案1

该文件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 的功能都需要查找表元数据并存储和检索脉动循环控制电路支持信息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;

这将告诉应用 InnoDB Cleanup 后可以回收多少浪费的空间。

答案2

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

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

答案3

如果你使用 innodb 作为 MySQL 引擎,默认情况下将存储全部将您的数据库放入 ibdata1。此外还有日志文件 ib_logfile0 和 ib_logfile1。不要删除这些文件。

答案4

似乎没有人提到innodb_undo_log_truncate设置可能产生的影响。

看看我的回答如何在 MySQL 中收缩/清除 ibdata1 文件在 StackOverflow 中。

相关内容