前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql的redo log和binlog

mysql的redo log和binlog

作者头像
是小张啊喂
发布2022-12-07 14:35:44
3710
发布2022-12-07 14:35:44
举报
文章被收录于专栏:软件

谈谈mysql的日志,主要围绕物理日志redo log和逻辑日志binlog,就像mysqlServe层和引擎层,Serve层主要负责功能层面的事情,而引擎层则负责存储相关的具体事宜.

那什么是redo log?什么是binlog

例:比如你在超市买东西结账,营业员在扫你购买的物品,这个时候会生成一个简单的购物清单,但是并不会直接进行超市的出库,等你结完账之后才会进行超市的物品出库,而redo log可以理解成正常结账的购物清单,而binlog则是在进行超市物品出库的记录

  • redo log是固定大小的,假设配置四个文件,每个文件的大小为1个G,那么可以记录4G的数据,从头写到尾,记录一个位置,当文件写入到当前位置,便开始擦除之前的记录,并在擦除前将记录更新至数据库。有了redo logInnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
  • binlogmysqlServer层的日志

两者的区别:

  1. redo logmysql引擎InnoDB所特有的,而binlogmysqlService层提供的,所有引擎都课余使用
  2. redo log是物理日志;binlog是逻辑日志
  3. redo log是循环写的,空间固定会用完;binlog是追加写入的,达到一定大小会切换到下一个

一条update语句是如何在mysql中执行的?

代码语言:javascript
复制
获取需要修改的行 --> 写入内存 --> 返回行数据 --> 写入新的数据 --> 新数据写入内存 --> 写入redo log --> 处于prepare阶段  --> 写入binlog --> 提交事物commit 

mysql将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。

两阶段提交的必要性:由于redo loginlog是两个独立的逻辑,如果不用两阶段提交,也就是不关心两者数据记录的同步情况,会出现什么情况?

  1. 先写redo log后写binlog
    • 如果redo log写完,binlog还没有写完,MySQL进程异常重启,由于redo log已经写完了,所以可以进行crash,但是由于binlog还没有写完就已经回滚了,所以在binlog日志中是没有记录的,那么如果 这个时候需要进行数据的回滚操作,就会缺少当前这条数据
  2. 先写binlog后写redo log
    • 如果binlog写完,redo log还没有写完,那么此时MySQL进程异常重启,此时进行crash,但是因为redo log还没有写入,如果之后使用binlog进行回滚,此时就与数据库不一致了

两阶段提交就是让这两个状态保持逻辑上的一致。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 那什么是redo log?什么是binlog?
    • 两者的区别:
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档