1、简述
当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。
日志缓冲区是内存存储区域,用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由innodb_log_buffer_size 变量定义,默认大小为16MB。
日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区可以运行大型事务,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘I/O。
innodb_flush_log_at_trx_commit :控制如何将日志缓冲区的内容写入并刷新到磁盘。
innodb_flush_log_at_timeout :控制日志刷新频率。
2、如何确定InnoDB日志缓冲区大小是否需要调整?
如果磁盘I/O导致性能问题,则需要观察事务,例如涉及许多BLOB条目的事务。只要InnoDB日志缓冲区已满,便会将其刷新到磁盘,因此增加缓冲区大小可以减少I/O。
另外需要观察的是MySQL的InnoDB重做日志(redo logs)。它们是磁盘上的一组文件,其中包含对InnoDB表所做的所有最近更改的记录,并在崩溃恢复期间使用。根据环境的不同,这些文件可能需要根据默认设置进行调整,例如日志的总数和大小。
日志文件的缺省数量为两个,分别名为 ib_logfile0 和 ib_logfile1 。日志具有固定大小,默认大小取决于MySQL版本。从5.7版本开始,默认值是每个48MB,从MySQL 5.6.3开始,最大总大小为 512GB。
3、如何确定日志文件的大小是否需要调整?
如果应用程序是写密集型应用程序,则可以使用48MB,并且鉴于日志以循环方式工作,当日志写满时,有必要对磁盘上的数据文件进行写操作。因此,如果日志文件的大小太小,可能会导致频繁的磁盘写入甚至是等待,从而极大地降低了性能。可以通过查看日志序列号状态变量log_lsn_current和log_lsn_last_checkpoint来观察刷新的频率。通过将两个值相减,并与重做日志空间的总大小进行比较,您可以了解刷新是否比期望的发生更频繁。
要调整 innodb_log_buffer_size 或 innodb_log_file_size 变量,必须在MySQL的配置文件中显式定义它们。在进行这些更改之前,请关闭实例,以确保MySQL正确无误地停止运行。如果在关闭过程中出现错误,则现有的日志文件可能尚未完全写入数据文件,并且数据可能会丢失。
总结:在考虑MySQL数据库性能时,Innodb_log_buffer_size和Innodb_log_file_size是要分析的两个重要变量。如果大型事务导致过多的磁盘I/O,则可以增加InnoDB日志缓冲区。出于相同的原因,InnoDB日志文件通常会基于默认值增加。如果它变得太快,则检查点刷新活动会增加,并且可能会导致性能降低。