[MySQL]更新语句执行与redo log和bin log

前言:

如果问起来,你是否清楚sql的更新过程呢?

对于innodb,学习了它的更新过程。这个文章更像是我的个人学习笔记和感悟。下面进行简述。

对于log和更新的详情,以后还可以更深入一点。

1.更新的日志模块redo log(innoDB的log)

因为sql的更新并不是立即更新,因为更新要找到对应哪条的数据项,很慢。而且每一条在执行的时候都要去找到去改,很繁琐。

所以mysql都是放到log中,等空闲时候在进行执行。

这个redo log是一个类似于环形链表的结构。可以配置这个文件大小。

从头开始写,写到末尾然后再从头开始循环。

如果不够用了,就清理掉一些记录,然后把checkpoint推进以下(这个点可以理解为写入的点)

1.1 redo log具有crash-safe功能

就是如果突然crash掉,还可以保证数据的完整性。

 

mysql5.6开启了crash-safe功能,这个功能保护了异常断电等sql丢失的问题。

这个功能涉及到了数据库主从功能,Master/slave 同步。

2. 对于server层的binlog(归档日志)

特点:

对于所有引擎都通用。(所有的引擎都可以读懂,不像redolog只有innodb可以知道)

相对于redolog,这个是逻辑层的改动日志。(redolog是对于某个存储页(文件系统)做了什么改动)

Binlog有两种模式 :  statement 格式的话是记sql语句,

                               row格式会记录行的内容,记两条,更新前和更新后都有。

redolog 是循环写,binlog 是追加写

binlog用来恢复数据库用,备份数据库进行整库备份,然后对于恢复到某一个时刻的数据,需要找到全量备份的最后时间点之后的binlog取出来,然后恢复数据。

3. 双重保险式--为什么有两个log?

因为最早mysql没有innoDB引擎,自带引擎MyISAM并没有这个日志功能。不能进行crash-safe;

redolog 更多是为了实现crash-safe 功能的。

更新语句的时候也相当于事务一样,

执行顺序: 先读取数据(在内存取出来,不在则磁盘读取)--执行更新操作--写入--先写入到内存中--写入redolog(进入准备状态)

--在写入binlog -- 最后一起提交进行commit状态

所以有点像事务,这两个log必须一起执行成功,不能有一个执行成功一个不成功;

4.总结

binlog在使用模式的时候一般都用row,因为库中可能会出现不一致的情况,row这种情况会记下来更新前和更新后。

物理速度是大于逻辑上的速度的。

redo log只有innodb有,别的引擎没有,redolog不是永久保存的,所以需要binlog作为归档功能,持久的保存数据,所以binlog并不能去掉。

redolog是顺序写(不需要去找位置,所以比较快,而更新到库里需要找位置),并且是组提交,所以具有这两个特点带来的优势。

只有最后一步commit之后,才会真正提交写入到数据库中,但是数据库崩溃可以可以接受“redolog prepare 并且binlog完整” 的情况;

如果redolog 已经commit了,崩溃恢复就不需要去找binlog,如果没有commit 需要去找binlog进行事务恢复。

写数据到磁盘存储数据是随机写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值