Ibdata1是InnoDB存储引擎之王该文件保存了从InnoDB存储引擎派生的数据、索引和元数据。它是如何工作的?我们可以做些什么来使我们使用存储引擎的工作尽可能有效?在这个博客中找到答案。 如果您在数据库领域至少有一段时间,并且熟悉MySQL或其任何风格,您肯定会知道InnoDB是什么它是MySQL提供的主要存储引擎之一,也是默认引擎自2010年发布MySQL5。5。5以来,InnoDB一直是存储引擎。InnoDB具有许多独特的怪癖和独特的特性但最吸引人的可能是存储引擎的主文件ibdata1。什么是ibdata1? ibdata1是整个InnoDB基础设施的王者该文件经常被称为表空间数据文件,这是有充分理由的:该文件存储与InnoDB相关的所有内容,包括但不限于: 基于InnoDB的表的数据和索引(如果启用设置innodbfilepertable,则此事实不适用即设置为1的值) 双写和插入缓冲区双写缓冲区由尚未在InnoDB数据文件中的页面组成,插入缓冲区主要用于处理索引的更改。 回滚段这些段允许完成未提交事务的回滚操作。 撤消空间这个空间包含告诉MySQL如何撤销事务所做的最新更改的影响的记录。 就MySQL而言,ibdata1独占其旗舰存储引擎InnoDB(存储引擎也是使用PerconaXtraDB时的默认引擎。)InnoDB以其支持ACID事务的能力而广为人知ACID是一个非常重要的特性即使在出现问题时也能保证数据的完整性和一致性例如,如果我们正在运行一个查询而我们的电力中断了,我们的数据将不会受到影响。然而,有一点需要注意虽然我们可以随时删除存储在InnoDB中的数据,但存储在ibdata1中的数据不能。虽然可以通过执行简单的DROPTABLE命令(见下文)随时删除基于InnoDB的表,但ibdata1文件的大小只能在my。cnf文件中定义。 图1使用DbVisualizer在数据库中删除一个表 ibdata1的问题 询问任何使用MySQL的经验丰富的DBA,您可以肯定他会建议您最好不要管ibdata1,而是去做其他事情。部分答案隐藏在ibdata1最初构建方式的核心背后倒回并阅读这一段之前的几段还记得我们是如何告诉你ibdata1存储与InnoDB相关的所有数据的吗? ibdata1的问题在于,当我们处理更大的数据集时,文件会变得大得不可思议如果我们没有将innodbfilepertable选项设置为1(这是从MySQL5。6。6开始的默认选项),它不能收缩。解决问题 如果我们没有启用innodbfilepertable选项,或者如果我们运行的是旧版本的MySQL,我们仍然可以采取一些措施来确保我们的MySQL实例即使在压力下也能像蜜蜂一样工作,方法是执行以下步骤: 我们需要备份MySQL基础架构中的所有数据。 我们需要删除varlibmysqlmysql。。data文件夹下的所有数据库(文件夹)(将。。替换为您的MySQL版本)目录,除了mysql和performanceschema文件夹(它们是MySQL正常运行所必需的。) 我们需要确保MySQL已停止并删除ibdata1和iblogfile0iblogfile1文件。这些文件对InnoDB至关重要,因为它们都存储了所有的重做日志,MySQL在重新启动后会读取它们,但是如果适当的数据库不在MySQL上次关闭时的完全相同的位置,MySQL就会出现问题启动。 最后,我们需要整体重启MySQL。 最后,我们需要重新导入我们在步骤1中获取的转储(始终应事先测试备份),如果我们返回数据文件夹,我们很可能会看到代表一个表的两个文件(在此例如,我们的表称为demotable): 名为demotable。ibd的文件存储与表相关的所有数据。 名为demotable。frm的文件存储所有必要的杂项信息(与表相关的元数据)。 问题解决了从现在开始,删除基于InnoDB存储引擎的表将是小菜一碟,即使我们无法通过GUI访问MySQL删除与表关联的两个文件就可以了,因为从现在开始,ibdata1将只存储与运行InnoDB或XtraDB存储引擎的表关联的元数据,而不是数据本身。 图2DbVisualizer中的表格及其相关文件 我们几乎完成了我们需要做的最后一件事是确保我们的ibdata1文件永远不会太大以至于我们的系统无法处理。我们可以通过完成以下步骤来做到这一点: 我们需要通过发出dfh命令找出磁盘上有多少空间。此命令将以人类可读的格式(h。)为我们提供磁盘上的可用空间量(df) 返回my。cnf并将设置innodbdatafilepath设置为在确定要在特定用例中分配给MySQL的磁盘空间量后适合您的值(参见下图。) 重新启动MySQL以使我们的更改生效。 图3my。cnf中的innodbdatafilepath设置 在我们的示例中,ibdata1的大小最初设置为10GB,但它可以扩展(自动扩展)并且此文件的最大大小(max)不应超过20GB。由于在上一步中我们已确保该文件将仅存储与表相关的元数据而不是数据本身,因此20GB的空间应该绰绰有余。 图4ibdata1的初始大小 概括 在本文中,我们带您了解了整个MySQL基础架构中最重要的文件ibdata1。我们已经教您如何确保此文件从长远来看不会造成任何问题,并在此过程中演示了DbVisualizer的一些功能。如果您喜欢阅读本文,请关注我们的博客,找到与DbVisualizer和数据库工程艺术相关的各种文章,以帮助释放数据库的力量并帮助您的公司取得成功,我们将在下一个。