02|日志系统:一条更新语句是如何执行的?

目录

思维导图

 引言

一.更新的流程

二.redo log(属于InnoDB引擎特有的日志)

(1)WAL技术

(2)crash-safe

三.binlog(server层,归档日志)

1.两种日志的区别

2.update语句时候的内部流程

3.数据恢复

四.二阶段提交

为什么使用二阶段提交(反例类说明)

小结

五.问题:全量备份的周期取决与系统重要性,那在什么场景下,一天一备比一周一备更有优势呢?或者说它影响了数据库的系统的那个指标呢?


思维导图

02|日志系统:一条SQL更新语句是如何执行的? | 八九. | 思维导图(新) | ProcessOn

密码:I3X8

 ​​​​​​​引言

从第一课我们就知道,一个条查询SQL语句的执行过程一般是经过连接器,分析器,优化器,执行器等功能模块,最后到达存储引擎,更新语句流程和查询语句的流程类似,但是在分析器中就会判读出这是一个更新语句,优化器判断索引去找数据,然后执行器负责具体的执行,但是 与查询不同,更新流程还涉及到了两个重要的日志模块

一.更新的流程

在mysql中,如果每一次更新操作都要写进磁盘,然后磁盘也要找到对应的那条记录,然后再跟新,整个过程IO成本,查询成本都很高,为了解决这个问题,mysql的就用了一种与一种 粉板和账本的方式来写数据。
粉板:对应的就是我们的日志模块,我们先把更新的在粉板上记下来,然后等粉板快满的时候,统一写到数据库之中,只要mysql一直运行,粉板和数据库的作用相同,知识粉板没有永久保存,如果关闭,就会数据消失
账本:就相当于磁盘,数据能在这里被持久化保存
这里只能使用InooDB引擎哦,因为他有crash-safe的能力(下面会细说)

二.redo log(属于InnoDB引擎特有的日志)

(1)WAL技术

WAL技术:write-ahead logging 就是先写日志,再写磁盘,也就是先写粉板,再写磁盘

(2)crash-safe

 redo log 是固定大小,分为四个文件,总共大小为4GB

write pos与checkpoint:前者是记录当前的位置,一边写,一边后移;后者是当前要擦除的位置,也是往后推移并且新换的,擦除记录前要把记录更新到数据库,这是在粉板上的操作,也就是在redo log上的操作
两者之前的距离就是拿来记录新的操作,有了redolog,InnoDB就可以保证即使数据库发生异常重启,之前调教的记录都不会丢失,这个能力就是crash-safe

三.binlog(server层,归档日志)

1.两种日志的区别

1.redolog是InnoDB引擎特有的,binlog是所有引擎都可以使用的
2.redo log 是物理日志,记录的是‘在某个数据上做了什么修改’,binlog是逻辑日志,记录的是这个语句的原始逻辑,比如‘给id=2这一行的c字段加1’
3.redolog是循环写的,binlog是可以追加写入的,追加写入指的是binlog文件写道一定大小后会切换到下一个,并不会覆盖以前的日志

2.update语句时候的内部流程

 3.数据恢复

binlog会记录所有的逻辑操作,采用追加写的形式,如果你的DBA承诺半个月内可以恢复数据,那么备份系统一定会保存最近半个月的所有binlog,同时系统会定期做整库的备份,这里的定期可以是一天一备,也可以是一周一备

例子:如果你在某个点误删了一个表
1.首先找到最近的一次全量备份
2.然后从备份的时间点开始,将备份的binlog一次取出来,重放到误删表的操作之前

四.二阶段提交

为什么使用二阶段提交(反例类说明)

1.先写redo log 再写binlog
假设在redolog写完,binlog没有写完,binlog还没有写完,mysql就进行了异常重启,redolog写完就发生了crash,数据已经更新到磁盘,但是binlog没有记录这条数据,所以如果用binlog来恢复数据的话,那就不会有刚刚redolog写入磁盘的数据
2.先写binlog 再写redo log
binlog已经写完,但是redolog还没有写,mysql在这时候进行了异常重启,那这条数据更新明明还没跟新,但是binlog已经记录更新了,恢复出来的数据就会和已经操作的不符合,可能会多出来一个数据或者说是事务,代码中的事务已经回滚,但是binlog已经记录了,那再运行就会多出来一个事务

小结

redolog用与保证crash-safe的能力,innodb_flush_log_at_trx_commit这个参数设置成1,表示每次事务的redo log 都直接持久化到磁盘中(保证mysql异常重启之后,数据不丢失)
sync_binlog这个参数设置成1,每次事务的binlog都会持久化到磁盘中(mysql异常重启,binlog不会丢失)

五.问题:全量备份的周期取决与系统重要性,那在什么场景下,一天一备比一周一备更有优势呢?或者说它影响了数据库的系统的那个指标呢?

这是要根据业务来说明
一天一备:好处是最长回复时间更短,但是经常备份的话那会频繁消耗更多存储空间,这个是根据RTO(恢复目标时间)成本来换得
所以和它有关的是恢复目标时间,和内存的成本,还有业务需求的重要性和容忍度。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腊Rou单车

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值