【2】更新一条MySQL语句到底发生了什么?

1.目录

1.redolog & binlog
2.剖析:update T set c=c+1 where id=2
3.redolog两阶段:prepare &commit
4.设置redolog&binlog持久化到磁盘

1.redolog & binlog

写在开头:

//本文涉及的数据库语句:
create table T(id int primary key);
update T set c=c+1 where id=10;

1.redolog(重做日志)&binlog(归档日志)
😄举个例子:
代文开了一家火锅店,本店可以赊账,倘若最近手头紧,没钱吃饭,可以先吃,在记账。
记账的这个工具,本店采用的是小黑板,记账形式如下:

  • 2020/9/12 张三 欠下20银元;
  • 2020/9/12 李四 欠下5银元;
  • 2020/9/12 XXX 欠下XX银元;

那么 ,问题来了,这个黑板写满了,该怎么办?难道写满了,赊账就无法继续了吗?或者说,若想继续,就得之前记好的擦除,那张三李四还会认这笔帐吗?!

这个时候,老板就想了一个机制-账本,一旦黑板写满了,就记录到账本中,再将黑板内容自顶向下擦除,继续赊账~
1.1redolog(重做日志)

redolog是InnoDB特有的日志,可以类比为上述提到的黑板,大小固定,保证即使数据库发生异常重启,之前的数据也不会丢失。也就是常听到的crash-safe;
就好比火锅店今天停业整顿,并不影响黑板和账本上的数据,一个道理。

1.2 binlog(归档日志)

binlog是MySQL的server层实现的,所有引擎都可以使用,属于逻辑日志,它记录语句逻辑;
如果吧redolog比作黑板,那么binlog就是账本,它是追加写的模式,写满一页会追加到下一页,不会覆盖以前的日志;
1.3redolog&binlog的区别

  • redolog是InnoDB特有的,binlog是MySQL的server层实现的,适用于多种引擎;
  • redolog是物理日志,记录某个数据页做了修改;binlog是逻辑日志,记录语句逻辑修改
  • redolog是循环写,空间固定,会用完;binlog是追加写,写满一页换下一页,不会覆盖前期内容;

2.剖析:update T set c=c+1 where id=2


3.redolog两阶段:prepare &commit

既然redolog和binlog在不同的模块,为什么要设置两个阶段?prepare和commit有什么作用?

思考:

  • 如果先写redolog,在写的过程中,这时候突然发生数据库异常重启,写了一半,怎么处理~
  • 如果写完redolog,已经提交了,在写 binlog时突然发生数据库异常重启,还没写完binlog,该怎么处理,那不相当于,我往黑板上写了数据,但我还没来得及往账本上记,就擦除了么~

  • 为了让两份日志之间的逻辑一致,确保数据库可以恢复到之前某个时间点的任一秒状态,开发者们提出了prepare和commit的概念,写完redolog之后,先不提交,进入prepare状态,等binlog写完后,再进入commit状态,一起提交事务,确保数据的正确性。

4.设置redolog&binlog持久化到磁盘

  • 将innodb_flush_log_at_txr_commit设为1。表示每次事务的redolog直接持久化到磁盘;
  • 将sync_binlog设为1。表示每次事务的binlog直接持久化到磁盘;
    这样做,均是为了保证MyQL异常重启后,redolog&binlog不丢失;

写在最后:
redolog是Innodb引擎特有的,它有保证crash-safe的能力

好了,本文就到这里吧,希望对你有所帮助~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值