| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL 事务日志 -> 正文阅读 |
|
[大数据]MySQL 事务日志 |
一、二进制日志(Binlog)1. Binlog概念Binlog 是
2. Binlog作用在实际应用中,主要用在两个场景:主从复制和数据恢复
3. Binlog 记录过程及刷盘时机Binlog 大致记录过程是先写 Binlog Buffer,然后通过刷盘时机,控制刷入 OS Buffer,控制 fsync() 进行写入 Binlog File 日记磁盘的过程。
对于 Binlog,MySQL 是通过参数 sync_binlog 参数来控制刷盘时机,取值是 0、1 和 N 三种值。0 表示由系统自行判断何时调用 sync() 写入磁盘;1 表示每次事务 commit 都要调用 fsync() 写入磁盘;N 表示每 N 个事务,才会调用 fsync() 写入磁盘。 4. Binlog 记录格式MySQL 5.7.7 版本之前默认格式是 二、事务日志(Undo log)1. Undo log 概念Undo log是 2. Undo log 作用
3. Undo log 记录过程及刷盘时机刷盘过程及时机类似于 Binlog 和 Redo,可以参考 Redo log 刷盘时机章节给出的图片,已经体现出来了。 4. Undo log 总结Undo log 日记内容不是很多,重点是 三、事务日记 (Redo log)1. Redo log 概念Redo log 是重做日记,属于InnoDB引擎的日记。是物理日记,日记记录的内容的是数据页的更改,这个页 “做了什么改动”。如:add xx记录 to Page1,向数据页Page1增加一个记录。
2. Redo log 作用
3. Redo log 容灾恢复过程MySQL的处理过程如下
只有在 redo log 状态为 prepare 时,才会去检查 binlog 是否存在,否则只校验 redo log 是否是 commit 就可以啦。怎么检查 binlog:一个完整事务 binlog 结尾有固定的格式。 4. Redo log 刷盘时机Undo log 的刷盘时机和 Redo log 差不多,但是对于 Undo log 我没找到对应的刷盘参数设计,所以不在提。Redo log 每次先写入 Redo Log Buffer 中,然后通过刷盘时机控制刷入 OS Buffer 时间和刷入日记磁盘的时间。 在 Undo Log 中,MySQL 是通过参数 5. Redo log 存储方式
上图是日记磁盘的 Redo log 环形设计图(从头写,写到结束又从头开始写~循环)。write pos 和 check point 是两个指针,write pos指针指向当前日记文件写入的位置,check point 指针指向当前要擦除的开始位置。图中绿色部分是可以写入 Redo log 地方,每次写入,write pos 指针会顺时针推进,当然基本不会与 check point 指针重合,因为 MySQL 有这种机制去实现,每次触发检查点 6. Redo Log 检查点啥时候会触发检查点 checkpoint
7. Redo Log LSNLSN 这个概念,比较复杂。LSN 称为日志的 存储方式两个指针又是通过 LSN 计算得到指向位置,因为 LSN 记录的是文件的大小字节,当超过文件大小时,需要用取模计算出这两个指针位置,取模使得写入就会从头开始写,这样使得两个指针在一个文件中,一直落在循环位置,你追我赶的过程。这就是 Redo log 环形逻辑思想设计实现。 上面提到LSN比较复杂,是因为它有很多个值,输入命令 show engine innodb status; ,可以看到四个的 lsn 记录
为了方便识别,我都为它们重新命名,如下所示。名词记不住,后面无法继续深入
一般关系为:redo log buffer lsn >= redo log file lsn,如果刷盘时机为1,则redo log buffer lsn = redo log file lsn。
一般关系为data buffer lsn > data disk lsn,如果已经刷入数据磁盘,则data buffer lsn = data disk lsn。
后面提到检查点刷盘,数据刷盘和日记刷盘(如果有日记刷盘:则说明我假设的日记刷盘的时机设置值不为1,为1 是同步的,即始终 redo log buffer lsn = redo log file lsn,不会由检查点触发刷日记磁盘)。 都说 Redo log 是环形记录,那么怎么记录的?下面结合 LSN 给出记录过程虚构图,可以对比 Redo log 存储方式图 1-8 按时间顺序发生。1 点是假设最初的状态;2、3 点写日记磁盘;4 点是触发了检查点 checkpoint,进行刷盘, 整个流程: 在某些情况下,触发 checkpoint,触发数据页和日志页刷盘,此时将内存中的脏数据— 刷盘时,对于数据磁盘,全部都是在内存中,此时每次刷一个数据页到内存更新数据页也更新了 对于日记磁盘,除了要记录 checkpoint lsn 的值为检查点 checkpoint的值(必须在结束时直接记录一个值,速度很快),这里是针对日记 模拟检查点触发前后,整个流程变化,一个数据页和日记, 8. Redo log 容灾恢复过程与 LSNRedo log 容灾恢复过程和 LSN 的知识,再次细化 Redo log 恢复过程 重启 innodb 时,Redo log 完不完整,采用 Redo log 相关知识。用 Redo log 恢复,启动数据库时,InnoDB 会扫描数据磁盘的数据页 data disk lsn 和日志磁盘中的 checkpoint lsn。两者相等则从 checkpoint lsn 点开始恢复,恢复过程是利用 redo log 到 buffer pool,直到 checkpoint lsn 等于 redo log file lsn,则恢复完成。 如果 checkpoint lsn 小于 data disk lsn,说明在检查点触发后还没结束刷盘时数据库宕机了。因为 checkpoint lsn 最新值是在数据刷盘结束后才记录的,检查点之后有一部分数据已经刷入数据磁盘,这个时候数据磁盘已经写入部分的部分恢复将不会重做,直接跳到没有恢复的 lsn 值开始恢复。 四、ChangeBuffer1. 为啥提到 ChangeBuffer为啥本文我会提到 ChangeBuffer 呢,其实很多时候会将 ChangeBuffer 和 Redo log 搞混,两者都是巧用内存,减少磁盘 IO,为了不弄混我觉得有必要专门对这个进行一个讲解。 2. ChangeBuffer 概念及作用下面是我对 ChangeBuffer 的简单介绍
也就是说对于更新的操作,如果用到了 ChangeBuffer,更新的数据所在的数据页如果不在内存中,将不用去数据磁盘将数据页读到内存,而是将这一次操作记录在 ChangeBuffer 中, 3. ChangeBuffer 与 Redo log 区别Redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 ChangeBuffer 主要节省的则是随机读磁盘的 IO 消耗 这句话怎么理解,看下面: Redo log 与 ChangeBuffer (含磁盘持久化) 这 2 个机制,不同之处在于优化了整个变更流程的不同阶段。 先不考虑 Redo log、ChangeBuffer 机制,简化抽象一个更新 (insert、update、delete) 流程:
其中,流程中的步骤 1 涉及随机读磁盘 IO;步骤 3 涉及随机写磁盘 IO;刚好对应 ChangeBuffer 和 Redo log。 对那句话的理解答案:
4. 有没有用到 ChangeBuffer 对于 Redo log 的区别Redo log 机制,为了保证 crash-safe,一直都会用到。有无用到 ChangeBuffer 机制,对于 redo log 这步的区别在于—— 用到了 ChangeBuffer 机制时,在 Redo log 中记录的本次变更,是记录 new change buffer item 相关的信息,而不是直接的记录物理页的变更。在我们 mysql innodb 中, ChangeBuffer 机制不是一直会被应用到,仅当待操作的数据页当前不在内存中,需要先读磁盘加载数据页时,ChangeBuffer 才有用武之地。 5. ChangeBuffer的 merge 过程
除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。 merge 过程做三步
五、日记大连贯U-R-B,一举攻破拿下前面分别讲的是 Binlog、Undo log 和 Redo log,下面将他们都串联起来,在一些流程体现全部日记。 同样,以一些最经典的更新语句例子展开说明。 1. 制造演示数据测试语句:插入语句+查询语句,a字段是普通索引
假设原来的数据如下图,数据页 page1 在内存中,page2 不在。插入的数据 (2,5) 落在 page1,数据 (7,5) 落在page2 中。 2. 假设没有日记和 ChangeBuffer 示范先不考虑所有日记及 ChangeBuffer 机制,简化抽象一个更新 insert 流程
3. 考虑所有日记和 ChangeBuffer 示范–现有 Innodb 流程过程是 两阶段提交-----日记刷盘------数据刷盘(涉及 Redo log lsn 和 ChangeBuffer 的内容) 3.1 两阶段提交过程
3.2 merge 过程紧接着上文,图片可上下参考,假设现在执行查询语句 select * from t where a in (2, 7) ,此次查询索引 a=7 所在的数据页不在内存中,并且上一步更新已经在 change buffer 中有记录,将会触发 merge 过程
至于 changebuffer 被应用后是删除还是标记,还有 redo 中原有的记录 changebuffer 的改动怎么调整是删除还是修改成数据页的改动这里下面的图是按照自己的想法描述出来,如有误望留言指正。 3.3 数据刷盘过程数据刷盘 flush 的有四种情况
数据刷盘也代表着 Redo log 检查点 checkpoint 触发,较为复杂。 假设数据刷盘 flush 的四种情况发生了一种,那么联系上文的过程将如下
参考链接
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:17:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |