ib_io_read

ib_io_readInnoDB 存储引擎 中的一个关键 I/O 操作指标,主要用于监控 MySQL 数据库的物理读性能。MySQL8.0+ ib_io_read = 4

  1. 线性预读

如果已读取,默认接下来还会读取,后台线程帮助读

  1. 随机预读

ibuf(Changer bugger) 加速更新,减少io读

主从相关

非主从切换场景下,可以向从库单独增加索引,提高查询速度。

page_flush_coordinator_thread

page_flush_coordinator_threadInnoDB 存储引擎中的一个线程,主要负责协调脏页的刷盘操作。主要功能有:

  • 脏页管理:负责将 InnoDB 缓冲池(Buffer Pool)中的脏页刷新到磁盘。脏页是指那些在内存中被修改但尚未写入磁盘的数据页;

  • 任务调度:作为 Page Cleaner 线程组的协调线程,它会根据系统负载、脏页数量和 I/O 能力等因素,计算每个缓冲池实例需要刷脏的页数,并将任务分配给工作线程;

  • 状态控制:通过维护一个状态数组来管理各个缓冲池实例的刷脏状态,确保线程之间的协同工作。

查询会触发刷脏页,如果usage满则末位淘汰策略

机器io压力大,应该把innodb_io_capacity(merge, flush线程)调小

purge thread:

InnoDB存储引擎中,Purge Thread(清理线程)是一个非常重要的后台线程,它主要负责清理(purge)那些已经提交的事务所修改的记录版本,从而释放资源并维护数据库的一致性。

ibd2sql(MySQL灾难恢复)

项目链接:

https://github.com/ddcw/ibd2sql

功能是将ibd文件解析成sql。

*.ibd 文件是 InnoDB 存储引擎中用于存储表数据和索引的文件。它是 InnoDB 表空间(Tablespace)的物理存储形式之一,与传统的 MyISAM 存储引擎的 .frm.MYD.MYI 文件不同,InnoDB 的 *.ibd 文件将数据和索引信息整合在一起。1. 文件结构

*.ibd 文件是一个表空间文件,它包含以下内容:

  • 数据页:存储表中的实际数据记录。

  • 索引页:存储表的索引信息,包括主键索引和辅助索引。

  • 系统页:存储表空间的元数据,如表空间的大小、页的分配情况等。

  • 事务日志页:记录与该表相关的事务日志信息,用于恢复操作。

文件命名

  • 每个 InnoDB 表都会有一个对应的 *.ibd 文件,文件名通常与表名相同。例如,如果表名为 my_table,那么对应的文件名就是 my_table.ibd

  • 这种命名方式使得每个表的数据和索引信息都存储在一个独立的文件中,便于管理和维护。

工作原理

  • 数据存储

    • InnoDB 使用页作为存储的基本单位,每个页的大小默认为 16KB(可以通过 innodb_page_size 参数配置)。

    • 数据页和索引页在 *.ibd 文件中以页的形式组织,InnoDB 的缓冲池(Buffer Pool)会将这些页加载到内存中进行操作。

  • 事务支持

    • *.ibd 文件中包含事务日志页,用于记录事务的修改操作。这些日志信息用于崩溃恢复和事务回滚。

  • 多版本并发控制(MVCC)

    • InnoDB 支持 MVCC,每个事务看到的数据版本是隔离的。*.ibd 文件中会存储多个版本的数据记录,Purge Thread 负责清理不再需要的旧版本记录。

文件操作

  • 创建

    • 当创建一个新的 InnoDB 表时,InnoDB 会自动创建一个对应的 *.ibd 文件。文件的初始大小通常为 64KB 或 96KB,具体取决于配置参数。

  • 扩展

    • 随着表中数据的增加,*.ibd 文件会自动扩展。InnoDB 会根据配置的 innodb_autoextend_increment 参数来决定每次扩展的大小(以MB为单位)。

  • 收缩

    • InnoDB 不会自动收缩 *.ibd 文件。如果表中的数据被大量删除,文件大小不会自动减小。可以通过 OPTIMIZE TABLEALTER TABLE 操作来重新组织表空间,从而释放未使用的空间。

  • 删除

    • 当删除一个 InnoDB 表时,对应的 *.ibd 文件也会被删除。

配置参数

  • innodb_file_per_table

    • 该参数控制是否为每个表创建独立的 *.ibd 文件。默认值为 ON,表示每个表都有一个独立的 *.ibd 文件。

    • 如果设置为 OFF,所有表的数据和索引将存储在共享表空间文件 ibdata1 中,这可能导致表空间文件过大,难以管理。

  • innodb_page_size

    • 该参数控制每个页的大小,默认为 16KB。页大小会影响 *.ibd 文件的存储效率和性能。

  • innodb_autoextend_increment

    • 该参数控制 *.ibd 文件每次自动扩展的大小,默认值为 64MB。

备份与恢复

  • 备份

    • 在备份数据库时,需要备份 *.ibd 文件以及相关的日志文件(如 ib_logfile0ib_logfile1)和配置文件(如 my.cnf)。

    • 可以使用 mysqldumpPercona XtraBackup 等工具进行备份。

  • 恢复

    • 恢复时,需要将备份的 *.ibd 文件还原到相应的位置,并确保日志文件和配置文件也正确还原。

    • 如果 *.ibd 文件损坏,可以通过 innodb_force_recovery 参数尝试恢复数据。

性能影响

  • 文件大小

    • *.ibd 文件的大小会影响磁盘 I/O 性能。较大的文件可能导致更多的磁盘寻道操作,从而降低性能。

  • 文件碎片

    • 随着数据的增删改操作,*.ibd 文件可能会产生碎片。可以通过定期执行 OPTIMIZE TABLEALTER TABLE 操作来减少碎片。

  • 缓冲池命中率

    • InnoDB 的缓冲池会将 *.ibd 文件中的页加载到内存中。如果缓冲池大小不足,可能会导致频繁的磁盘 I/O 操作,从而降低性能。

常见问题与解决方法

  • 文件过大

    • 如果 *.ibd 文件过大,可以通过 OPTIMIZE TABLEALTER TABLE 操作重新组织表空间,释放未使用的空间。

  • 文件损坏

    • 如果 *.ibd 文件损坏,可以通过 innodb_force_recovery 参数尝试恢复数据。如果无法恢复,可能需要从备份中恢复。

  • 性能问题

    • 如果 *.ibd 文件导致性能问题,可以调整缓冲池大小(innodb_buffer_pool_size)、页大小(innodb_page_size)等参数来优化性能。

*.ibd 文件是 InnoDB 存储引擎中用于存储表数据和索引的关键文件。它支持事务、多版本并发控制和高效的存储管理。通过合理配置和维护 *.ibd 文件,可以有效提高数据库的性能和可靠性。