• MySQL-redo log 和 binlog


    redo log部分
    为什么需要redo log?

    简单的说,如果每次更新数据库的操作,都去更新磁盘的话,开销是很大的。通过引入redo log日志,其中记录了每次更新的操作明细,在系统不繁忙的时候,再更新到磁盘中,可以节省开销。

    最新修改:
    redo log 最主要的作用就是用于数据库异常宕机的恢复工作
    假如数据库永远不会发生异常宕机,那么其实根本不需要redo log,因为innodb中有线程不断的做把脏页刷新到磁盘的工作,数据库如果一直不宕机,就不会出现问题。

    被划掉的线的部分的理解的产生是因为在极客时间《mysql实战45讲》的课程中,老师就是这么说的,所以就直接这么写了。但在后续的学习中,我查阅了《MySQL技术内幕-InnoDb存储引擎的实现》这本书,发现了最开始的理解并不准确,所以进行了修改。

    redo log的实现

    redo log是一个环,大小是固定的,文件个数和大小是可以配置的。其中有两个指针,write和checkpoint,分别对应可以写入的位置,和已经刷新到磁盘的位置。

    当write追上了checkpoint,说明已经没有空闲的位置可以写入了,就需要刷新一下,保证有位置可以写入。


    binlog部分
    redo log 和 binlog的区别
    1. redo log是 innodb存储引擎特有的;binlog是server层,属于共有的
    2. redo log是物理日志,记录在某个数据页的修改;binlog是逻辑日志
    3. redo log是一个环,循环写;binlog是追加写,不会覆盖以前的日志
    4. redo log用于异常重启恢复;binlog用于备份

    一条更新语句的执行过程(redo log和binlog的配合)
    1. 执行器调用引擎接口写入新数据
    2. 引擎把更新操作记录到 redo log中,此时redo log为prepare状态
    3. 执行器生成这个操作的binlog,并写入磁盘
    4. 执行器调用引擎的事务提交接口,引擎把redo log的状态改为commit

    微信图片_20200630172321.jpg

    prepare和binlog是如何保证一致性的?
    1. prepare阶段
    2. binlog写入阶段
    3. commit阶段

    在2阶段之前崩溃时:

    • 重启恢复:发现没有commit,回滚
    • 备份恢复:没有binlog

    保持了一致性

    在3阶段之前崩溃时:

    • 重启恢复:虽没有commit,但是binlog有,并且一致,所以恢复
    • 备份恢复:有binlog

    保持了一致性


    最佳实践部分
    1. innodb_flush_log_at_trx_commit 参数建议设置为1,每次更新操作,redo log都会刷新到磁盘
    2. sync_binlog 参数建议设置为1,每次更新操做,binlog会刷新到磁盘
  • 相关阅读:
    mysql 统计新增每天数据
    Oracle dg下掉一个从库
    rman全备脚本
    Linux Shell 统计一(行列)数值的总和及行、列转换
    pt工具加字段脚本
    MySQL慢日志切割邮件发送脚本
    MySQL主从复制邮件报警脚本
    读书清单
    数据库学习笔记
    JAVAEE学习笔记
  • 原文地址:https://www.cnblogs.com/ging/p/13467776.html
Copyright © 2020-2023  润新知