MySQL之谈谈MySQL里的日志

news2024/10/5 13:46:39

文章目录

  • 前言
  • 一、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.coloradmin.cn/o/1428580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逸学区块链【solidity】真随机数

参考Get a Random Number | Chainlink Documentation 但是很贵,价格 Gas Price:当前gas价格,根据网络状况而波动。Callback gas :返回您所请求的随机值时,回调请求消耗的gas 量。验证gas :量gas 用于验证…

【ADI 知识库】X 波段相控阵开发平台 硬件 2

ADAR1000EVAL1Z (Stingray) ADAR1000-EVAL1Z评估板是一款模拟波束成形前端,设计用于测试ADAR1000和ADTR1107的性能。ADAR1000 是一款 8 GHz 至 16 GHz、4 通道、X 波段和 Ku 波段波束成形器 IC。ADTR1107是 6 GHz 至 18 GHz 前端发送/接收模块。 ADAR1000-EVAL1Z板…

理解网站的账号和密码构成

什么是baolipojie 使用暴力的方式进行用户名或密码的破解,反复试错的方式 为什么 最终的目的:获取用户名和密码 网站的权限划分:超级管理员 管理员 VIP 普通用户 baolipojie的准备工作 1、学习的靶场(DVWA) 2、字典 3、Burp suite 如何进行baolipojie 本来说…

力扣461. 汉明距离(位运算)

Problem: 461. 汉明距离 文章目录 题目描述思路复杂度Code 题目描述 思路 Problem: 力扣191. 位1的个数(位运算) 该题只需要在上题的基础上先对两个数进行一次异或操作即可 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( 1 ) O(1) O(1) Code …

【python接口自动化】- 对接各大数据库

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

C:\Users\ShuYixiao>mysql ‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

这个错误信息表明 mysql 命令在你的系统中没有被识别。这通常意味着 MySQL 没有安装在你的电脑上,或者它的可执行文件路径没有添加到系统的环境变量中。以下是一些解决这个问题的步骤: 确认 MySQL 是否已安装: 如果你还没有安装 MySQL&#x…

LLM(3) | 自注意力机制 (self-attention mechanisms)

LLM(3) | 自注意力机制 (self-attention mechanisms) self-attention 是 transformer 的基础, 而 LLMs 大语言模型也都是 transformer 模型, 理解 self-attention, 才能理解为什么 LLM 能够处理好上下文关联性。 本篇是对于 Must-Read Starter Guide t…

LISN究竟是什么?有什么作用?

在电子领域中,LISN是一个充满神秘感的工具,常常被用于电磁兼容性测试。本文将深入探讨LISN的本质是什么,以及它在电子领域中扮演的关键角色。 1. 认识LISN LISN,全称为Line Impedance Stabilization Network,即线路阻…

Jetpack Compose系列(1)-初识Jetpck

Jetpack Compose是什么 2019年的I/O大会上,Google宣布Kotlin成为Android开发首选语言(这次不是第一次说了),且后续会有新的Jetpack API和功能将在Kotlin中提供,并同时开源Jetpack Compose。 简介 Jetpack是一套库、…

骨传导耳机的原理是什么?骨传导耳机是如何传输声音的

随着生活质量的日益提升,可穿戴智能设备的种类和款式也愈发丰富多彩。特别是耳机产业的快速演变,不仅在类型上多样化,其外观设计也呈现出各式各样的趋势。然而,对于运动爱好者来说,真正合适的运动耳机却并不多见。在众…

Acwing---802.区间和

区间和 1.题目2.基本思想3.代码实现 1.题目 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m次询问,每个询问包含两个整数 l 和…

Pycharm安装插件

经常用Pycharm写代码的话,时不时的就会接触到一些好用的插件,如何安装插件呢?经常使用的是两种方式,分别是在线安装和离线安装。 在线安装 在线安装比较简单,打开Pycharm,在左上角【文件】->【设置】-…

深度学习入门笔记(四)函数与优化方法

深度学习有三大部分 模型表征(包括模型设计、网络表示等)模型评估(上一篇文章提到的准确召回和损失函数等)优化算法(模型如何学习或更新)本节我们就来介绍模型是如何学习或更新的。 4.1 损失函数 模型的学习,实际上就是对参数的学习。参数学习的过程需要一系列的约束,…

构建LLM辅助生物威胁制造预警系统 人类越发展获取的超能力越大,破坏力越大,威胁越大。我们需要什么样的预警系统?既克服威胁又具有超能力 安全基础

https://openai.com/research/building-an-early-warning-system-for-llm-aided-biological-threat-creation 人类越发展获取的超能力越大,破坏力就越大,威胁越大。 人工智能就是为了赋予人人都能有超能力,而一旦被恶意或无意使用又威胁到人…

如何在Shopee平台上进行手机类目选品?

在Shopee平台上进行手机类目的选品是一个关键而复杂的任务。卖家需要经过一系列的策略和步骤,以确保选品的成功和销售业绩的提升。下面将介绍一些有效的策略,帮助卖家在Shopee平台上进行手机类目选品。 先给大家推荐一款shopee知虾数据运营工具知虾免费…

tqdm双进度条训练模型

效果图 from tqdm import tqdm import time pbar1 tqdm(total5, position0, desc"Epoch", leaveFalse, colourgreen, ncols100,unit"epoch") for i in range(5):pbar2 tqdm(total10, position1, desc"Iteration", leaveFalse, colourred, ncol…

宠物商业数据分析

一、宠物热销品类分布 欧睿国际更有一份数据表明,宠物食品在所有“它经济”中占比是最大,仅仅是猫狗食品就达到了59.1%,增速也远高于其他宠物用品。 2018年,中国就已经有超7700万独居成年人口,国内养宠主力军中90后占…

C语言——标准输出函数(printf、putchar和puts)

目录 1. 标准输入输函数出头文件2. printf2.1 函数申明2.2 基本用法2.3 占位符2.4 输出格式2.4.1 限定宽度2.4.2 总是显示正负号2.4.3 限定小数位数2.4.4 输出部分字符串 3. putchar3.1 函数申明3.2 基本用法 4. puts4.1 函数申明4.2 基本用法 1. 标准输入输函数出头文件 #inc…

应急响应事件处理过程参考手册

D盾介绍及下载 下载地址:http://www.d99net.net/ 使用步骤与杀毒软件类似,下面简要说一下 D盾使用步骤 更新规则库 点击检测更新,自动更新到最新的规则库 更新后在底部会显示当前规则库版本: 选择网站根目录,进行w…

Linux下grep命令详解

grep #文件内容过滤显示 #在指定的普通文件中查找并显示含有指定字符串的行,也可与管道符一起使用格式: grep-参数 查找条件 文件名 参数: 示例: [rootnode1 ~]# grep -n "root" /etc/passwd # -n&a…