MySQL之谈谈MySQL里的日志

文章目录

  • 前言
  • 一、SQL是如何做更新操作的
  • 二、MySQL中的redo log
  • 三、MySQL中的binlog
  • 四、聊聊两阶段提交
  • 总结


前言

上一章我们讲了一条SQL是如何做查询的,其中经历了许多步骤。这次来讲讲一条SQL是如何做更新操作的。
常有大佬说他可以把MySQL恢复到半个月内任意一秒的状态,今天也来谈谈这是如何做到的呢?


一、SQL是如何做更新操作的

之前我们讲到了一条SQL的执行要经过连接器、查询缓存、分析器、优化器、执行器,最后到达存储引擎。其实更新语句也会同查询语句一样,把这些路都走一篇。不过会在此基础上更多一些步骤。还是以一条SQL为例子:

创建一个表T

mysql> create table T(ID int primary key, c int);

如果想把ID=10这行的值+1,SQL就是这样:

mysql> update T set c=c+1 where ID=10;

先通过连接器连接数据库。如果查询缓存中有值就取,没有就走下一步。,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器负责具体执行,找到这一行,然后更新。

与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)。
在这里插入图片描述


二、MySQL中的redo log

设想一下,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。那么MySQL是如何解决这个问题的呢?
这就不得不提到MySQL里常说的WAL技术。全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写把那些SQL都记录下来,等统一时间再来写入。

具体来说,当有一条记录要更新的时候,InnoDB引擎会把这条记录先写到redo log里,并更新内存,再等到系统比较空闲的时候把这个操作记录更新到磁盘。如果一直都很忙没有空闲,那么redo log就会先写入一部分,为后面留下空间。(InnoDB的redo log是固定大小的。比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么总共就可以记录 4GB 的操作,每次更新一部分到磁盘就可以把已更新的内容擦除)。

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。也就是就算异常重启也能找到写在redo log中的SQL执行内容了。


三、MySQL中的binlog

redo log是InnoDB引擎特有的日志。Sever层也有自己的日志,binlog(归档日志)。

这两种日志有以下三点不同。

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

那么我们回头来看看上面的SQL在MySQL里是怎么执行的:

  1. Server层中的执行器先找引擎取 ID=10 这一行。根据主键ID,引擎直接找到这一行。如果 ID=10 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上 1,得到新的一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

下图浅绿色为在Server层执行,白色为引擎中执行。
在这里插入图片描述

看完你可能会问,写入redo log后这个prepare是啥意思,还有写完binlog又要commit提交事务。这里的prepare和commit就是将redo log拆成了两阶段提交。


四、聊聊两阶段提交

为什么必须有“两阶段提交”呢?这是为了让两份日志之间的逻辑一致。由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。还是以前面的SQL举例。

1.如果先写redo log后写binlog,结果服务器故障了。redo log写完后c的值就已经+1了,但是由于binlog还没有写完就挂了,之后备份恢复的时候,binlog语句丢失,恢复的值还会是0。
2.如果先写binlog后写redo log。由于binlog写完之后挂了,redo log还没写,服务器恢复后发现事务无效,这个值还是0。但是binlog中已经记录了c从0变成1的日志。最后用binlog恢复的时候就会成为1,和原来库中的不同。

简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。


总结

MySQL的日志系统在确保数据完整性、持久性和恢复能力方面起着关键作用。
数据一致性:通过重做日志和撤销日志,即使在系统故障的情况下,也能保证数据的一致性。当系统重启时,可以使用重做日志来恢复未完成的事务。
复制和备份:二进制日志用于主从复制和数据备份。从服务器可以读取主服务器的二进制日志,以保持与主服务器相同的数据状态。这使得实现高可用性和负载均衡变得容易。
慢查询监控:查询日志和慢查询日志可以帮助我们识别和优化性能问题。通过分析这些日志,可以找到需要优化的SQL语句或配置。
审计:查询日志可以用于审计目的,跟踪对数据库的访问和修改操作。这对于安全性和合规性检查非常有用。

补充:
MySQL的日志:
二进制日志(Binary Log):记录了对数据库执行的所有修改操作,以二进制形式存储。主要用于复制和数据恢复。
重做日志(Redo Log):存在于InnoDB存储引擎中,用于保证事务的持久性。
撤销日志(Undo Log):也存在于InnoDB存储引擎中,用于支持事务的回滚操作和多版本并发控制。
查询日志(General Query Log)和慢查询日志(Slow Query Log):用于记录数据库的活动和慢查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/366642.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年美赛B题:寻找潜水器 Searching for Submersibles 思路模型代码解析

2024年美赛B题:寻找潜水器 Searching for Submersibles 思路模型代码解析 【点击最下方群名片,加入群聊,获取更多思路与代码哦~】 问题翻译 海上游轮迷你潜艇(MCMS)是一家位于希腊的公司,专门制造能够将人…

jQuery前段开发--星级评价和图形跟随指针移动

一、实验原理: 当鼠标移入某个星星,前面的星星都会被点亮;当鼠标移出,星星将会变暗,单击某个星星后,即可完成评论,此时鼠标移出后,被单击星星前面的星星都会被点亮,后面…

GmSSL - GmSSL的编译、安装和命令行基本指令

文章目录 Pre下载源代码(zip)编译与安装SM4加密解密SM3摘要SM2签名及验签SM2加密及解密生成SM2根证书rootcakey.pem及CA证书cakey.pem使用CA证书签发签名证书和加密证书将签名证书和ca证书合并为服务端证书certs.pem,并验证查看证书内容: Pre Java - 一…

在Mixamo网站上,下载的模型导入unity后没有材质怎么解决

在Mixamo网站上,下载的模型导入unity后没有材质 1.导入的模型没有材质2.解决方法3.提取后就有材质了 1.导入的模型没有材质 2.解决方法 选中导入的模型 > 选择提取纹理>选择你要提取到的文件夹(默认是当前文件夹)>点击 fix now 3.提取后就有材质了

力扣hot100 最小路径和 多维DP 滚动数组 一题多解

Problem: 64. 最小路径和 文章目录 思路💖 朴素版💖 空间优化版 思路 👨‍🏫 路飞 💖 朴素版 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public …

026-安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

026-安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全 #知识点: 1、PHP新闻显示-数据库操作读取显示 2、PHP模版引用-自写模版&Smarty渲染 3、PHP模版安全-RCE代码执行&三方漏洞 演示案例: ➢新闻列表&…

linux麒麟系统安装mongodb7.0

1.mogedb下载 下载的是他tar包 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.5.tgz wget -o https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.5.tgz 也可以下载rpm包 2.将包上传至服务器并解压 #进入目录 并解压 cd /opt/ tar …

动网格-网格重构之弹性光顺局部重构法(四)

弹性光顺法的基本特点 弹性光顺法中,网格线类似于弹簧,两端节点(node)作弹性移动 弹性光顺法有如下特点。 (1)节点的数量和节点之间的连接关系均不变,即节点之间的连接属性不变。 (2)单独使用时,仅限于变形非常小的情况&#xff…

常用API2---system

是一个工具类,提供了一些与系统相关的方法. 常用方法: package MyApi.a02Systemdemo;public class SystemDem01 {public static void main(String[] args) {//方法形参://状态码://0 表示当前虚拟机是正常停止//非0:1表示当前虚拟…

TRUNCATE TABLE和DELETE FROM对比

相同点:用于删除数据,同时保留表结构. 不同点: TRUNCATE比DELETE更快(数据量小可能体现不出来,单数据量大就很明显了) 原因:TRUNCATE是DDL(数据定义语言)DELETE是逐行删除属于(DML) TRUNCATE 不会产生大量日志,但DELETE删除会产生大量日志 DELETE FROM 可以加WHERE子句指定…

(已解决)spingboot项目如何做QQ邮箱注册功能,如何在邮箱注册中进行随机数添加作为动态验证码,并满足分层解耦

前面我们已经完成了发送静态验证码,现在用随机数作为动态验证码。 文章地址:spingboot 后端发送QQ邮箱验证码 使用注解Component进行分层解耦加入ioc容器,方便调用。 package com.example.tianyidemo.utils; import org.springframework.st…

新媒体与传媒行业数据分析实践:从网络爬虫到文本挖掘的综合应用,以“中国文化“为主题

大家好,我是八块腹肌的小胖, 下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作 目录 1、数据获取 2、数据处理 3、词频统计及词云展示 4、文本聚类分析 5、文本情感倾向性分析 6、情感倾向演化分析 7、总结 1、数据获取 本…

AI算力专题:华为算力分拆:全球AI算力的第二极

今天分享的是AI算力系列深度研究报告:《AI算力专题:华为算力分拆:全球AI算力的第二极》。 (报告出品方:华西计算机团队) 报告共计:53页 全球龙头英伟达业绩持续高度景气,印证全球A…

字符串的简单处理

第1题 ISBN号码 查看测评数据信息 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最…

[css] 让文字进行竖着 分散对齐

.demo2 {width: 60px;background-color: aqua;height: 200px;display: grid;place-items: center;}参考: css 让文字进行竖着书写, 附带个小知识,行内块元素添加文字之后底部对不齐的问题

24.云原生之ArgoCD钩子

云原生专栏大纲 文章目录 Argo CD钩子如何定义钩子钩子删除策略 Argo CD钩子 Argo CD 是一个用于部署和管理 Kubernetes 应用程序的工具,它提供了一种声明式的方式来定义和自动化应用程序的部署过程。Argo CD 钩子(Hooks)是一种机制&#x…

朴素贝叶斯原理

朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的…

盘点Ubuntu上的那些必装软件-游戏篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、原生游戏1.纸牌2.扫雷3.数独4.麻将5.20486.国际象棋7.吃豆人8.围棋 二、Steam游戏1. CSGO&CS22.战争雷霆3.Dota24. 足球经理20185.文明66.地铁:离去7.完…

Linux:进程信号的概念与产生原理

文章目录 信号的概念实践信号关于前台和后台进程的操作 操作系统与外设信号的产生signal系统调用 前面的篇章结束了信号量的话题,那么接下来引入的是信号的话题,信号和信号量之间没有任何关系,只是名字比较像 信号的概念 在生活中存在各种各…

【C语言进阶篇】assert宏 使用详解

文章目录 一、assert简介 二、assert使用方法和规则 2.1 头文件 2.2 原型 2.3 功能 2.4 示例 2.5 assert的打开与关闭 三、注意事项 3.1 运行效率问题 3.2 assert只适用于调试版本 3.3 资源释放与清理 3.4 过度依赖 四、总结 个人主页: 倔强的石头的…