Mysql-BinLog,RedoLog,UndoLog傻傻分不清

BinLog,RedoLog,UndoLog傻傻分不清

我们先看下5.7 innodb的磁盘存储结构
在这里插入图片描述

1. UndoLog

是实现innodb MVCC的重要组成部分

概述:

  • Undolog :事务开始之前,将修改的记录放到Undo日志中,当事务回滚或者数据库崩溃时,利用Undo日志,撤销未提交事务对数据库产生的影响

  • Undolog 产生和销毁: Undo log在事务开始前产生;事务在提交时,并不会立刻删除undo log,innodb会将事务对应的undolog 放到删除列表中,后面会通过后台线程purge thread进行回收处理,Undo log 属于逻辑日志,记录一个变化过程。例如delete ,undo会记录一个insert。

  • Undolog 存储:采用段的方式管理,innodb数据文件中包含一种 rollback segment回滚段,内部包含1024个 undologsegment

    show variables like ‘%innodb_undo%’

  • Undolog在磁盘存储 5.7中,既可以存在 ibdata 中,也可以在独立的undo空间中,或者临时表空间中。

    8中 ,已经单独出来了一个 undo tablespace

作用:

  • 实现事务的原子性

  • 实现多版本并发控制(MVCC)

在这里插入图片描述

事务A 对User表的某条记录进行修改,那么此时会先备份一个旧数据到UndoBuffer中,UndoBuffer会持久化到 undolog中。

如果此时事务回滚,那么会通过 rundo buffer进行回滚。

如果此时事务提交,那么innodb会将事务对应的undolog放到purge thread处理的一个列表中,等待purge thread删除。

在事务未提交之前, 假设事务B进行查询,那么就会查询UndoBuffer中的数据。

2. RedoLog

RedoLog :

dirtyPage中持久化到redolog

事务中修改的任何数据,将最新的数据备份存储的位置(RedoLog),重做日志

产生和释放:随着事务操作的执行,就会生成redolog,事务提交时会产生redolog 写入log buffer,并不是随着事务的提交立刻写入磁盘,等事务操作的脏页数据写入到磁盘后,redolog占用的空间就可以重用。

Redolog 工作原理

在这里插入图片描述

Redo log 写入机制

在这里插入图片描述

  • write pos 是当前记录的位置,一边写一边后移动

  • checkpoint是当前要擦除的位置,也是往后推移并且循环

  • 如果write pos 和 checkpoint 中间有空的部分,可以用来记录新的操作,如果writepos 追上了checkpoint,表示写满,此时就不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint 推一下

  • Redo log相关参数

    • 每个InnoDB存储引擎至少有一个重做日志组。

      show variables like ‘%innodb_log%’

    • Redo Buffer 持久化到 redo log的策略,可以通过innodb_flush_log_at_trx_commit

  • Prepate/commit 两阶段提交 : 假设数据库某一时刻崩溃,会将 prepared记录进行重放。

3. BinLog

概述

Binlog 是记录所有数据库表结构变更以及表数据修改的二进制日志,不会记录select 和 show这类操作。Binlog日志以事件形式记录,包含语句执行的消耗时间

  • 主从复制

    主库中开启binlog功能,这样可以将binlog传递给从库

  • 数据恢复

    通过mysqlbinlog工具恢复数据

Binlog文件名默认为"主机名_binlog-序列号",也可以在配置文件中指定名称。

文件记录模式有三种

  • row:日志会记录每一行数据被修改的情况,然后再slave端对相同的数据进行修改

    优点:能清除记录每一个行数据的修改细节,能完全实现主从数据同步和数据恢复

    缺点:批量操作,会产生大量的日志,尤其是alter table 会让日志暴涨

  • statment:每一条被修改数据的sql都会被记录到master的binlog中,slave在复制的时候,从机执行相同的sql

    优点:日志可控、减少磁盘IO

    缺点: 某些情况下,主从不一致,比如 last_insert_id(),now() 会出现问题

  • mixed:混合使用,使用statement模式保存binlog,对statement模式无法复制的操作使用row保存binlog

binlog写入机制

  • 根据记录模式和操作触发event事件生成log event

  • 将事务执行过程中产生log event 写入缓冲区,每个事务线程都有一个缓冲区

    Log event 保存在一个 binlog_cache_mngr数据结构中,在该结构中,有两个缓冲区变量,一个stmt_cache用于存放不支持事务的信息,另一个是trx_cache,用于存放支持事务的信息

  • 事务在提交阶段会将产生的log event写入到外部binlog文件中

    不同的事务以串行的方式将log event写入binlog文件中,所以一个事务包含的log event信息在文件中是连续的,中间不会插入其他事务的log_event

总结:

综上

  • 按照层级划分

    • binlog 属于server层
    • undolog ,redolog是innodb数据引擎功能
  • 记录内容:

    • binlog记录的属于逻辑日志,需要记录更新过程。
    • undolog 记录的也是逻辑日志
    • redolog 记录是物理日志,只关注结果,记录该数据页更新状态内容
  • 写日志方式:

    • undolog 实质上也会固定大小

    • redolog 是循环写,通过checkpoint进行擦除,wirte pos进行写入更新。日志空间大小固定

    • binlog 日志是追加。

  • 用途:

    • undolog 主要用在事务处理上,是MVCC的重要组成部分
    • redolog 也与事务相关.可以在服务器异常后,做事务数据的自动恢复
    • binlog主要做主从复制以及数据恢复,没有自动crash-safe能力。

扩展:

利用binlog进行数据恢复功能的实验

注意前期我们需要先开启binlog功能,并重启mysql服务

1、mysql> show variables like '%log_bin%';

2、#修改my.ini配置文件,在 mysqlid 下增加 
log_bin=mysql_bin_log
server_id=1 #必须写否则会报错  You have enabled the binary log, but you haven't provided the mandatory server-id. Please refer to the proper server start-up parameters documentation

重启服务
service mysqld restart
  • 数据准备
  • 数据准备

在这里插入图片描述

  • 模拟一个糊涂蛋的操作 删库跑路

  • 发现问题,我们需要先查找下现在对哪个binlog日志进行了操作:

    可以使用 show master status; 或者 show binary logs;

  • 查找需要恢复的点

    > [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKhhusQF-1629034088305)(BinLog和RedoLog.assets/image-20210815212708978.png)]

  • 我们设置时间点

    如果找不到位置,可以show variables like ‘%dir%’

    [root@node01 mysql]# mysqlbinlog --start-position=1590 --stop-position=2425 mysqlbinlog.000001 | mysql -uroot -proot
    
  • 查看结果:
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

一只板栗

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值