MySQL数据库InnoDB存储引擎Log漫游

  • 时间:
  • 浏览:0
  • 来源:欢乐生肖APP下载_欢乐生肖APP官方

  好在一点问题报告 图片被缩小到了一一五个多 页面的范围内,但会 比较容易防止。InnoDB存储引擎中用Double Write的措施

  来防止一点问题报告 图片。

- 事务的原子性(Atomicity)

  事务中的所有操作,要么删剪完成,要么不做任何操作,不后能 只做帕累托图操作。但会 在执行的过程中存在  了错误,要回滚(Rollback)到事务现在开始英文了了前的情形,就像一点事务从来什么什么都这么执行过。

  B. 净页,映射到了一一五个多 数据文件页,但会 什么什么都这么被修改过。内容和数据文件的页一样。  C. 脏页,映射到了一一五个多 数据文件页,但会 数据被修改过。内容和数据文件的页不一样。

不足:每个事务提交前将数据和Undo Log写入磁盘,曾经会是因为 多量的磁盘IO,但会 性能很低。

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游

  B. Double write有我本人的写buffer.  C. 先将多个要做doublewrite的page写入内存的buffer,但会 再一块儿写到磁盘上。

- InnoDB Redo Log的日志类型

  InnoDB redo log的格式能不后能 概括为:  <Space ID>+<Page NO.>+<操作类型>+<数据>.

- 原理

  Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据日后,首先将数据备份到一一五个多 地方  (一点存储数据备份的地方称为Undo Log)。但会 进行数据的修改。但会 跳出了错误但会 用户执行了  ROLLBACK语句,系统能不后能 利用Undo Log中的备份将数据恢复到事务现在开始英文了了日后的情形。

- 异步Checkpoint

  实现了幂等规则后,脏页就能不后能 在任好久间,以任何顺序写入持久存储了。InnoDB的buffer pool有  一套单独的机制来刷脏页。但会 什么都有有情形下checkpoint时,之什么都有有写脏页到存储。要是 将所有脏页的  最小的LSN记做checkpoint.  checkpoint的实现在log0log.c.  log_checkpoint()实现异步checkpoint.

  但会 Log中不能不后能 记录不同的内容:

- 物理的日志(Physical Log)  A. 记录删剪的Page  B. 记录Page中被修改的帕累托图(page中的偏移,内容和长度).

  MySQL数据库InnoDB存储引擎的Redo Log 记录的要是 一点物理和逻辑相结合的日志。

  使用页内的逻辑日志,能不后能 减少日志占用的空间。但会 它毕竟还是逻辑日志,里面提到的一一五个多 问题报告 图片不能防止吗?  A. 页面内的帕累托图执行的情形能不后能 认为不存在了。但会 整个页面的操作是原子操作,在完成日后是不让写     到磁盘上的。  B. 操作一致性的问题报告 图片仍然存在。但会 在写一一五个多 Page到磁盘时存在了故障,但会 是因为 Page Header的记     录数被加1了,但会 数据什么什么都这么刷新到磁盘上,总之页面上的数据不一致了。

  这里只提到了帕累托图Redo Log的类型,删剪的定义在mtr0mtr.h文件中. 通过一点类型的定义,能不后能

  很容易的找到后能 哪些地方地方使用了。

Fuzzy Checkpoint

  A. 在重做Redo Log时,并不关心事务性。 恢复时,什么什么都这么BEGIN,也什么什么都这么COMMIT,ROLLBACK的行为。

     要是 关心每个日志是哪个事务的。尽管事务ID等事务相关的内容会记入Redo Log,哪些地方地方内容要是 被当作     要操作的数据的一帕累托图。  B. 使用B策略就必不后能 将Undo Log持久化,但会 必不后能 在写Redo Log日后将对应的Undo Log写入磁盘。     Undo和Redo Log的一点关联,使得持久化变得复杂化起来。为了降低复杂化度,InnoDB将Undo Log看作     数据,但会 记录Undo Log的操作也会记录到redo log中。曾经undo log就能不后能 象数据一样缓存起来,     而不让在redo log日后写入磁盘了。     含晒 Undo Log操作的Redo Log,看起来是曾经的:     记录1: <trx1, Undo log insert <undo_insert …>>     记录2: <trx1, insert …>     记录3: <trx2, Undo log insert <undo_update …>>     记录4: <trx2, update …>     记录5: <trx3, Undo log insert <undo_delete …>>     记录6: <trx3, delete …>  C. 到这里,还一一五个多多 问题报告 图片什么什么都这么弄清楚。既然Redo什么什么都这么事务性,那你造会重新执行被回滚了的事务?     着实是曾经。一块儿Innodb也会将事务回滚时的操作也记录到redo log中。回滚操作本质上也是     对数据进行修改,但会 回滚时对数据的操作也会记录到Redo Log中。     一一五个多 回滚了的事务的Redo Log,看起来是曾经的:     记录1: <trx1, Undo log insert <undo_insert …>>     记录2: <trx1, insert A…>     记录3: <trx1, Undo log insert <undo_update …>>     记录4: <trx1, update B…>     记录5: <trx1, Undo log insert <undo_delete …>>     记录6: <trx1, delete C…>     记录7: <trx1, insert C>     记录8: <trx1, update B to old value>     记录9: <trx1, delete A>     一一五个多 被回滚了的事务在恢复时的操作要是 先redo再undo,但会 不让破坏数据的一致性.

  看mtr_memo_slot_note_modification()和buf_flush_note_modification().

  虽说Redo Log将数据的操作细分到了页面级别。但会 一点在多个页面上的操作是逻辑上不可分裂的。

  比如B-Tree的分裂操作,对父节点和一一五个多 子节点的修改。当进行恢复时,要么删剪恢复,要么删剪不  恢复,不后能 只恢复其中的帕累托图页面。InnoDB中通过mini-transaction(MTR)来保证哪些地方地方不可再分  的操作的原子性。

- 幂等(Idempotence)规则

  如上图所示,checkpoint 在LSN1位置,当checkpoint完成时R1,R2对应的修改也被刷到了持久存储。  恢复不后能 从LSN1位置现在开始英文了了,包括R1, R2在内。重新执行后,数据还能正确吗?  幂等规则要求无论redo log被执行了有几个次,数据始终正确。  InnoDB的redo log, 物理到Page,Page内是逻辑日志。  物理日志,火山岩支持幂等规则. 但会 逻辑日志 不后能 特殊防止,不能支持满足幂等规则。

但会 不能将数据缓存一段时间,就能减少IO提高性能。但会 曾经就会丧失事务的持久性。但会 引入了另外一

种机制来实现持久化,即Redo Log.

- 用Undo Log实现原子性和持久化的事务的复杂化过程

  假设有A、B一一五个多 数据,值分别为1,2。  A.事务现在开始英文了了.  B.记录A=1到undo log.  C.修改A=3.  D.记录B=2到undo log.  E.修改B=4.  F.将undo log写到磁盘。  G.将数据写到磁盘。  H.事务提交  这里一一五个多多 隐含的前提条件:‘数据后能 先读到内存中,但会 修改内存中的数据,最后将数据写回磁盘’。

- 逻辑日志的一致性问题报告 图片

  前面说了逻辑日志的一致性问题报告 图片是很复杂化的,为哪些地方undo log要用逻辑日志呢?  但会 redo log使用了physiological日志和MTR,就能不后能 保证在恢复时重做完redo log后,  数据是一致。在执行undo时,就之什么都有有考虑一点问题报告 图片了。

- InnoDB存储引擎中相关的函数

  Redo: recv_recovery_from_checkpoint_start()  Undo: recv_recovery_rollback_active()  Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

- MTR的ROLLBACK

  看过MTR的代码发现mtr什么什么都这么记录undo日志,要是 能rollback. MTR后能 很小的操作单元,但会 每个MTR  后能 明确的操作目标,但会 比较容易保证其正确性。  A. 但会 页面操作是在内存中完成,但会 页面有固定的格式,但会 什么都有有的页面操作是不让失败的。     InnoDB存储引擎中的什么都有有写页面的函数都什么什么都这么返回值.  B. 在对任何页面操作前,什么什么都这么检查有无但会 存在错误。但会 但会 存在错误就不后能 往下执行。     如,当插入一行记录到B-Tree的节点时,首先检查页面有足够的空间。  C. 使用更大粒度的锁(如B-Tree的锁),但会 按照一定的顺序加锁。曾经不能不是因为 死锁问题报告 图片。

  但会 undo log不后能 被MVCC和Purge使用,什么都有有还有TRX_ID和DATA_ROLL_PTR等特殊的内容记录

  在日志中。TRX_UNDO_INSERT_REC不让后能 记录哪些地方地方内容.但会 MVCC中不可内引用一一五个多 不存在的数据。  这也是事务将insert和update、delete的undo log分开存放的是因为 。事务提交后,insert的undo  占用的空间就能不后能 立即释放了.

- MTR的LSN

  A. 但会 在将日志写入redo log buffer时,不能获得LSN。什么都有有修改数据时,并什么什么都这么修改页上的LSN。     不后能 在MTR获得LSN后统一修改。  B. 一一五个多 MTR只一一五个多多 LSN. 一一五个多 MTR内修改的所有页的LSN相同。曾经checkpoint就不让跳出在MTR的里面。  C. 在获得LSN后,但会 被MTR修改的脏页什么都这么buffer pool的flush_list里,就会被上上加。

- 原理

  假设在某个时间点,所有的脏页都被刷新到了磁盘上.一点时间点日后的所有Redo Log就不让后能 重  做了。系统记录下一点时间点时redo log的结尾位置作为checkpoint. 在进行恢复时,从一点  checkpoint的位置现在开始英文了了即可。Checkpoint点日后的日志也就不再不让后能 ,能不后能 被删除掉。为了  更好的利用日志空间,InnoDB以环形缓存(circular buffer)的措施来使用日志空间。

- Fuzzy Checkpoint

  如下图所示,但会 刷脏页的一块儿用户还在更新数据,LSN1前的某个脏页在刷到持久存储日日后能 但会 被  LSN1日后的某个操作给修改了。当checkpoint完成时,LSN1后的帕累托图操作(R1,R2对应的操作)也被  持久化了。当Sharp checkpoint完成时,持久存储中存储的数据是某个确切时间点的内存数据的快照。  Fuzzy checkpoint完成时,持久存储中存储的数据后能 某个确切时间点的内存数据的快照。从一点  程度上,能不后能 说持久存储中的数据丧失了一致性。在恢复时,必不后能 防止一点问题报告 图片。

- Double Write

  Double Write的思路很简单:  A. 在覆盖磁盘上的数据前,先将Page的内容写入到磁盘上的一点地方(InnoDB存储引擎中的doublewrite      buffer,这里的buffer后能 内存空间,是持久存储上的空间).  B. 但会 再将Page的内容覆盖到磁盘上曾经的数据。

- MTR日志的封装

  为了在日志文件中区分不同的MTR,MTR将MLOG_SINGLE_REC_FLAG或MLOG_MULTI_REC_END写入  redo log(mtr_log_reserve_and_write()).  A. 但会 MTR的日志中不后能 一行记录,在日志的现在开始英文了了处上加MLOG_SINGLE_REC_FLAG,表示MTR中不后能      一条记录。  B. 但会 MTR的日志含晒 多行记录,在日志的结尾处上加一一五个多 类型为MLOG_MULTI_REC_END的日志,     代表MTR的日志到此现在开始英文了了.

  A. 进行恢复时,只重做但会 提交了的事务。

  B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。但会 通过Undo Log回滚哪些地方地方     未提交的事务。

  但会 在A步骤时系统故障,曾经的数据什么什么都这么被覆盖,还是删剪的。

  但会 在B步骤时系统故障,曾经的数据不删剪了,但会 新数据但会 被删剪的写入了doublewrite buffer.  但会 系统恢复时就能不后能 用doublewrite buffer中的新Page来覆盖一点不删剪的page.

  A. 尽量保持Redo Log存储在一段连续的空间上。但会 在系统第一次启动时就会将日志文件的空间删剪分配。

     以顺序追加的措施记录Redo Log,通过顺序IO来改善性能。  B. 批量写入日志。日志并后能 直接写入文件,要是 先写入redo log buffer.当不后能 将日志刷新到磁盘时     (如事务提交),将一点日志一块儿写入磁盘.  C. 并发的事务共享Redo Log的存储空间,它们的Redo Log按语句的执行顺序,依次交替的记录在一块儿,     以减少日志占用的空间。之类 ,Redo Log中的记录内容但会 是曾经的:     记录1: <trx1, insert …>     记录2: <trx2, update …>     记录3: <trx1, delete …>     记录4: <trx3, update …>     记录5: <trx2, insert …>  D. 但会 C的是因为 ,当一一五个多 事务将Redo Log写入磁盘时,也会将一点未提交的事务的日志写入磁盘。  E. Redo Log上只进行顺序追加的操作,当一一五个多 事务不后能 回滚时,它的Redo Log记录要是 会

MySQL数据库InnoDB存储引擎事务日志系列文章:

MySQL数据库InnoDB存储引擎Log漫游(1)MySQL数据库InnoDB存储引擎Log漫游(2)

  优点:但会 恢复时,删剪不依赖原页面上的内容,什么都有有之什么都有有求持久化了的数据保持在一一五个多 一致的情形。

       比如在写一一五个多 页面到磁盘上时,系统存在故障,页面上的一部数据写入了磁盘,另一帕累托图丢失了。       这时仍然能不后能 恢复出正确的数据。

- Checksum

  检测页面有无一致的功能是靠Checksum来完成的,每个页面修改完成日后能 记算一一五个多 页面的checksum。  一点checksum存贴到 页面的尾部.每次从磁盘读一一五个多 页到内存时,都不后能 检测页的一致性。  函数buf_page_is_corrupted()是用来检测page的一致性的.

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容富足,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源。

05 – 缓存池(Buffer Pool)

学习到这里,我更倾向于说这是一一五个多 ”Redo+Undo+Buffer”的模式。为了提搞IO性能,脏页缓存在buffer中,Redo log也要先缓存在内存中,doublewrite后能 内存buffer. Buffer pool在一点模式中是至关重要的。

06 – 参考

  A. Database Systems: The Complete Book (2nd Edition)  B. Transaction Processing: Concepts and Techniques  C. how-innodb-performs-a-checkpoint  D. InnoDB fuzzy checkpoints  E. Heikki Tuuri Innodb answers – Part I  F. Heikki Tuuri Innodb answers – Part II

- 数据是哪些地方

  之什么都有有同的厚度和层次来看,亲戚朋友 儿能不后能 将数据库中的数据看作:  A. 关系数据  B. 元组或对象  C. 存在Page中的二进制序列

Undo + Redo事务的特点

  A. 为了保证持久性,不后能 在事务提交前将Redo Log持久化。  B. 数据不让后能 在事务提交前写入磁盘,要是 缓存在内存中。  C. Redo Log 保证事务的持久性。  D. Undo Log 保证事务的原子性。  E. 一一五个多多 隐含的特点,数据必不后能 晚于redo log写入持久存储。

- 同步Checkpoint

  InnoDB的buffer pool通过LRU的算法来决定哪些地方脏页应该被写入持久存储。但会 含晒 最小LSN的  页面频繁的被更新,它就不让被刷到存储上。曾经就但会 是因为 checkpoint点很长一段时间无法前进,  甚至是因为 日志空间被占满。这时就要按照LSN由最小到大的顺序写一帕累托图脏页到持久存储。  log_checkpoint_margin().  log_calc_max_ages()用来计算,‘判断有无要执行同步checkpoint’用到的参数.

  代码在:buf0dblwr.cc

  buf_flush_write_block_low()调用  buf_dblwr_write_single_page()或 buf_dblwr_add_to_batch()来实现doublewrite.

- 逻辑的日志(Logical Log)

  记录在关系(表)上的一一五个多 元组操作。  A. 插入一行记录。  B. 修改一行记录。  C. 删除一行记录。  逻辑日志比起物理的日志,显得简洁的多。但会 占用的空间也要小的多。  但会 逻辑日志一一五个多多 缺点:  A. 帕累托图执行     之类 :表T一一五个多多 索引,在向T插入1条记录时,不后能 分别向一一五个多 B-Tree中插入记录。     有但会 第一一五个多 B-Tree插入成功了,但会 第五个B-Tree什么什么都这么插入成功。在恢复或     回滚时,不后能 防止哪些地方地方特殊情形。  B. 操作的一致性问题报告 图片     一一五个多 插入操作一一五个多多 B-Tree的分裂,页A的一半数据移到了B页,A页写入了磁盘,B页什么什么都这么写入磁盘。     但会 这日后存在了故障,不后能 进行恢复,逻辑日志是什么什么都这么甩掉的。

03 – 日志的内容

- 原理

  和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,但会 将Redo Log持久化即可,  不让后能 将数据持久化。当系统崩溃时,着实数据什么什么都这么持久化,但会 Redo Log但会 持久化。系统能不后能 根据  Redo Log的内容,将所有数据恢复到最新的情形。

00 – Undo Log

Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。

- Undo + Redo事务的复杂化过程

  假设有A、B一一五个多 数据,值分别为1,2.  A.事务现在开始英文了了.  B.记录A=1到undo log.  C.修改A=3.  D.记录A=3到redo log.  E.记录B=2到undo log.  F.修改B=4.  G.记录B=4到redo log.  H.将redo log写入磁盘。  I.事务提交

  哪些地方地方类型定义在:trx0rec.h.

  记录日志的过程在:trx_undo_page_report_insert()和trx_undo_page_report_modify()中。  Undo操作在row0undo.c, row0uins.c和row0umod.c中, 入口函数是row_undo().

  锁对象存储在mtr的memo中。调用mtr_s_lock和mtr_x_lock来加锁时,锁对象被保存到memo中。

  解锁在mtr_memo_slot_release()中完成。

  Double write 显然会曾加磁盘的IO。直觉上IO次数增加了1倍,但会 性能损失并后能 很大。Peter在

  innodb-double-write中说性能损失不超过5-10%。应该是但会 多数情形下使用了批量写入的缘故。  A. Double write buffer是一段连续的存储空间,能不后能 顺序写入。

- flush_list

  同步checkpoint时,不后能 根据数据页修改的先后顺序来将脏页写入持久存储。但会 除了LRU链表,  buffer pool中还一一五个多多 按脏页修改先后顺序排列的链表,叫flush_list.当不后能 同步checkpoint时,  根据flush_list中页的顺序刷数据到持久存储。  A. 一一五个多 页只在flush_list中跳出1次,但会 一一五个多 页面只不后能 写一次。  B. 按页面最早一次被修改的顺序排列。

- 恢复策略

  前面说到未提交的事务和回滚了的事务也会记录Redo Log,但会 在进行恢复时,哪些地方地方事务要进行特殊的  的防止.有2中不同的恢复策略:

- MTR的一致性

  为了满足MTR的一致性,MTR做了如下的设计:  A. MTR的所有日志被封放进一块儿,当MTR提交时一块儿写入redo log buffer.     曾经做一一五个多多 好处:     * 减少并发MTR对redo log buffer 的竞争。     * 连续的存储在一块儿,恢复时的防止过程更简单。  B. InnoDB在redo log的层面,将一一五个多 MTR中的所有日志作为Redo log的最小单元。在恢复时,一一五个多 MTR

     中的所有日志不后能 是删剪的不能进行恢复。

- 物理和逻辑结合的日志(Physiological Log)

  一点日志将物理和逻辑日志相结合,取其利,去其害。从而达到一一五个多 相对更好的一一五个多 情形。一点日志一一五个多多 特点:  A. 物理到page. 将操作细分到页级别。为每个页上的操作单独记日志。     比如,一一五个多 Insert分别在一一五个多 B-Tree的节点上做了插入操作,什么什么都这么就分别为每一一五个多 页的操作记录一条日志。  B. Page内采用逻辑的日志。比如对一一五个多 B-Tree的页内插入一条记录时,物理上来说要修改Page Header的     内容(如,页内的记录数要加1),要插入一行数据到某个位置,要修改相邻记录里的链表指针,要修改Slot的     属性等。从逻辑上来说,要是 在一点页内插入了一行记录。但会 Page内的逻辑日志只记录:’这是一一五个多      插入操作’和’这行数据的内容‘。

除了能不后能 保证事务的原子性,Undo Log不能不后能 用来辅助完成事务的持久化。

理论上来说,但会 MySQL数据库InnoDB存储引擎的buffer足够大,就不让后能 将数据一点持久化。将删剪的redo log重新执行一遍

就能不后能 恢复所有的数据。但会 随着时间的积累,Redo Log会变的很大很大。但会 每次都从第一条记录现在开始英文了了恢复,恢复的过程就会很慢,从而无法被容忍。为了减少恢复的时间,就引入了Checkpoint机制。

  逻辑的日志上的‘帕累托图执行’的问题报告 图片是比较好维护的,但会 ‘一致性’的问题报告 图片维护起来是很复杂化的。

- Sharp Checkpoint

  对于繁忙的系统来说,很少会跳出曾经的的一一五个多 时间点。为了能创发明的故事曾经一一五个多 时间点,最简单的办  法要是 ,在某个时间现在开始英文了了停止一切更新操作,直到所有的脏页被刷新到磁盘,Checkpoint被记录。 

  显然对于繁忙的系统, 一点措施是很多花费的。能不后能 在checkpoint时不停止用户的操作呢?

- 数据页的最新(最大)LSN

  为了满足幂等规则,InnoDB中每个数据页上都记录一一五个多多 LSN。每次更新数据页时,将LSN修改为  当前操作的redo log的LSN。在恢复时,但会 数据页的LSN大于等于当前redo log的LSN,则跳过此  日志。

  之什么都有有能一块儿保证原子性和持久化,是但会 以下特点:

  A. 更新数据前记录Undo log。  B. 为了保证持久性,不后能 将数据在事务提交前写到磁盘。但会 事务成功提交,数据必然但会 持久化。  C. Undo log不后能 先于数据持久化到磁盘。但会 在G,H之间系统崩溃,undo log是删剪的,     能不后能 用来回滚事务。  D. 但会 在A-F之间系统崩溃,但会 数据什么什么都这么持久化到磁盘。什么都有有磁盘上的数据还是保持在事务现在开始英文了了前的情形。

- 页分类

  Buffer pool内的页分为一点:  A. 未被使用的页(空白的buffer),什么什么都这么映射到一一五个多 数据文件中页。

- 事务的持久性(Durability)

  事务一旦完成,该事务对数据库所做的所有修改后能 持久的保存到数据库中。为了保证持久性,数据库  系统会将修改后的数据删剪的记录到持久的存储上。

01 – Redo Log

  Redo Log记录的页面操作大致能不后能 分为以下几种类型:

  A. 在页面上写入N个字节的内容,哪些地方地方能不后能 看作是物理的Log.     MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES, MLOG_8BYTES, MLOG_WRITE_STRING     各种Page链表的指针修改,以及文件头,段页等的内容的修改后能 以一点措施记录的日志。  B. 页面上的记录操作。     MLOG_REC_*, MLOG_LIST_*, MLOG_COMP_REC_*, MLOG_COMP_LIST_*     哪些地方地方日志记录了对B-Tree页的INSER, DELETE, UPDATE操作和分裂合并操作。  C. 文件和Page操作     MLOG_FILE_CREATE, MLOG_FILE_RENAME, MLOG_FILE_DELETE,     MLOG_PAGE_CREATE, MLOG_INIT_FILE_PAGE, MLOG_PAGE_REORGANIZE  D. Undo Log操作     MLOG_UNDO_*     InnoDB中将undo log的操作也记入了redo log. 为哪些地方要曾经做,在前面‘恢复’但会 说了.

本文主要介绍了final关键字的使用措施及原理

- IO性能

  Undo + Redo的设计主要考虑的是提升IO性能。虽说通过缓存数据,减少了写数据的IO.  但会 却引入了新的IO,即写Redo Log的IO。但会 Redo Log的IO性能不好,就不后能 起到提高性能的目的。  为了保证Redo Log不能有比较好的IO性能,InnoDB 的 Redo Log的设计有以下有几个特点:

- InnoDB存储引擎的恢复机制

  MySQL数据库InnoDB存储引擎使用了B策略, InnoDB存储引擎中的恢复机制有有几个特点:

  缺点:Log记录的内容什么都有有,占用很大的空间。如B-Tree的分裂操作,要记录约一一五个多 删剪Page的内容。

Sharp Checkpoint

- 脏页(dirty page)

  但会 一一五个多 数据页在内存中修改了,但会 还什么什么都这么刷新到磁盘。一点数据页就称作脏页。

04 – Checkpoint

  以上是我本人看代码后的最少印象,不一定说到了正点上。MTR模块的代码虽简单,但会 MTR在一点模块多量的

  使用。要透彻的理解MTR,估计还得要看一点模块的代码,埋点出来大帕累托图MTR操作过程才行.

- 页级锁

  提交时才写日志到redo log的做法,决定了MTR要使用页级锁。  A. 一一五个多 页面不后能 一块儿被多个活动的MTR修改。  B. MTR中数据页的锁,直到MTR提交时(日志写入redo log buffer)后才释放。

  A. 从表中删除一行记录

     TRX_UNDO_DEL_MARK_REC(将主键记入日志)     在删除一条记录时,并后能 真正的将数据从数据库中删除,要是 标记为已删除.曾经做的好处是     Undo Log中不让记录整行的信息.在undo时操作也变得很简单.

  B. 向表中插入一行记录     TRX_UNDO_INSERT_REC(将主键记入日志)     TRX_UNDO_UPD_DEL_REC(仅将主键记入日志) 当表含晒 一条被标记为删除的记录和要插入的     数据主键相一块儿, 实际的操作是更新一点被标记为删除的记录。  C. 更新表中的一条记录     TRX_UNDO_UPD_EXIST_REC(将主键和被更新了的字段内容记入日志)     TRX_UNDO_DEL_MARK_REC和TRX_UNDO_INSERT_REC,当更新主键字段时,实际执行的过程     是删除旧的记录但会 ,再插入一条新的记录。

02 – 恢复(Recovery)

06 – Mini-Transaction(MTR)

前面提到Redo Log将数据的操作细分到了页面级别。但会 一点在多个页面上的操作是逻辑上不可分裂的。InnoDB中用Mini-Transaction来表示哪些地方地方不可再细分的逻辑操作。

- 日志顺序号(Log Sequence Number)

  LSN是日志空间中每条日志的现在开始英文了了点,用字节偏移量来表示。在Checkpoint和恢复时使用。

- InnoDB Undo Log的日志类型

  MySQL数据库InnoDB存储引擎的undo log采用了逻辑的日志。  InnoDB undo log的格式能不后能 概括为:<操作类型>+<Table ID>+<数据>.

- LRU

  InnoDB维护了一一五个多 LRU列表。当空间不足时,用来决定哪些地方脏页应该被首先写入磁盘,哪些地方净页应该被释放掉。  A. buffer_pool->LRU,普通LRU链表,记录所有数据缓冲页。  B. buffer_pool->unzip_LRU,是压缩页(row_format=compressed)解压后数据缓冲页LRU链表。  LUR链表中的页面按最近一次的访问的时间顺序排列,头部是最后一次被访问的页面,尾部是最早一次被  访问的页面。无论是读还是写一一五个多 页面上的数据,后能 先获取一点页面。但会 能不后能 在获取页面时,维护  LRU链表.当获取一一五个多 页面后,将其贴到 LRU链表的头部即可。  buf_page_get_gen()和buf_page_get_zip()用来获取一一五个多 页面,亲戚朋友 调用  buf_unzip_LRU_add_block()和buf_page_set_accessed_make_young()来维护LRU链表。