合买源码搭建建与MySQL · 引擎特性

一 序
本文根据《MYSQL运维内参》第11章INNODB日志管理机制整理,本篇书上侧重于原理说明日志的生成、格式、工作原理、刷盘机制等。限于篇幅,崩溃恢复的需要单独整理。InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性。解释下redolog与事务持久性:redo log用来数据异常恢复和数据库重启时页数据同步恢复,redo log是建立在在mini transaction基础上。数据库在执行事务时,通过minitransaction产生redo log来保证事务的持久性。合买源码搭建QQ:2152876294 网址diguaym.com

 和大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的WAL(log write ahead),即在持久化数据文件前,保证之前的redo日志已经写到磁盘。

  LSN(log sequence number) 用于记录日志序号,它是一个不断递增的 unsigned long long 类型整数。在 InnoDB 的日志系统中,LSN 无处不在,它既用于表示修改脏页时的日志序号,也用于记录checkpoint,通过LSN,可以具体的定位到其在redo log文件中的位置。LSN在引擎中定义的是一个dulint_t类型值。源码在innobase/include/log0log.h

/ Type used for all log sequence number storage and arithmetics /
typedef ib_uint64_t lsn_t;
LSN的含义是储存引擎向重做日志系统写入的日志量(字节数),这个日志量包括写入的日志字节 + LOG_BLOCK_HDR_SIZE + LOG_BLOCK_TRL_SIZE;代码参见函数log_write_low(源码在innobase/log/log0log.cc)。在调用日志写入函数LSN就一直随着写入的日志长度增加,它是一个集物理意义与逻辑意义与一体的。

  为了管理脏页,在 Buffer Pool 的每个instance上都维持了一个flush list,flush list 上的 page 按照修改这些 page 的LSN号进行排序。因此定期做redo checkpoint点时,选择的 LSN 总是所有 bp instance 的 flush list 上最老的那个page(拥有最小的LSN)。由于采用WAL的策略,每次事务提交时需要持久化 redo log 才能保证事务不丢。而延迟刷脏页则起到了合并多次修改的效果,避免频繁写数据文件造成的性能问题。
   innodb在5.6设计了3个层模块,即redo log buffer(redo log的日志内存缓冲区)、group files( redo log文件组)和archive files( 归档日志文件)。由于 InnoDB 日志组的特性已经被废弃(redo日志写多份),归档日志(archive log)特性也在5.7被彻底移除,所以不做展开。

好吧,虽然上面都是常识,但是对于初次接触的还是要理解下。因为百度出来的文章不一定是基于那个版本。

二 InnoDB 日志文件
InnoDB的redo log可以通过参数innodb_log_files_in_group配置成多个文件,另外一个参数innodb_log_file_size表示每个文件的大小。因此总的redo log大小为innodb_log_files_in_group * innodb_log_file_size。
Redo log文件以ib_logfile[number]命名,日志目录可以通过参数innodb_log_group_home_dir控制。Redo log 以顺序的方式写入文件文件,写满时则回溯到第一个文件,进行覆盖写

  在InnoDB内部,逻辑上ib_logfile被当成了一个文件,对应同一个space id。由于是使用512字节block对齐写入文件,可以很方便的根据全局维护的LSN号计算出要写入到哪一个文件以及对应的偏移量。
   Redo log文件是循环写入的,在覆盖写之前,总是要保证对应的脏页已经刷到了磁盘。在非常大的负载下,Redo log可能产生的速度非常快,导致频繁的刷脏操作,进而导致性能下降,通常在未做checkpoint的日志超过文件总大小的76%之后,InnoDB 认为这可能是个不安全的点,会强制的preflush脏页,导致大量用户线程stall住。

除了redo log文件外,InnoDB还有其他的日志文件,例如为了保证truncate操作而产生的中间日志文件,包括 truncate innodb 表以及truncate undo log tablespace,都会产生一个中间文件,来标识这些操作是成功还是失败,如果truncate没有完成,则需要在 crash recovery 时进行重做。

Log Block

猜你喜欢

转载自blog.51cto.com/13914116/2156204