MySQL日志文件

news2024/11/25 3:56:54

文章目录

    • 1.MySQL中的日志文件
    • 2.bin log的作用
    • 3.redo log的作用
    • 4.bin log和redo log的区别
      • (1)存储的内容
      • (2)功能
      • (3)写入时间
      • (4)写入方式
    • 5.两阶段提交
    • 6.undo log的作用

1.MySQL中的日志文件

在这里插入图片描述

  • 错误日志(error log):对MySQL的启动、运行、关闭过程进行了记录,能帮助定位MySQL问题。
  • 慢查询日志(slow query log):用来记录执行时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。
  • 一般查询日志(general log):记录了所有对MySQL数据库请求的信息,无论请求是否正确执行。
  • 二进制日志(bin log):记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。

InnoDB存储引擎特有的日志文件:

  • 重做日志(redo log):记录了对于InnoDB存储引擎的事务日志。
  • 回滚日志(undo log):回滚日志的作用就是对数据进行回滚。当事务对数据库进行修改,InnoDB引擎不仅会记录redo log,还会生成对应的undo log日志;如果事务执行失败或调用了rollback,导致事务需要回滚,就可以利用undo log中的信息将数据回滚到修改之前的样子。

2.bin log的作用

主要有两个作用:主从复制 和 恢复数据

  • MySQL在公司使用的时候往往都是一主多从结构的,从服务器需要与主服务器的数据保持一致,这就是通过binlog来实现的。
  • 数据库的数据被干掉了,我们可以通过binlog来对数据进行恢复。

3.redo log的作用

假设有一条sql语句:

update user_table set name='java3y' where id = '3'

MySQL执行这条SQL语句,是先把id=3的这条记录查出来,然后将name字段给改掉。

实际上Mysql的基本存储结构是页(记录都存在页里边),所以MySQL是先把这条记录所在的页找到,然后把该页加载到内存中,将对应记录进行修改。

现在就可能存在一个问题:如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了怎么办?显然这次更改就丢了。
在这里插入图片描述
如果每个请求都需要将数据立马落磁盘之后,那速度会很慢,MySQL可能也顶不住。所以MySQL是怎么做的呢?

MySQL引入了redo log,内存写完了,然后会写一份redo log,这份redo log记载着这次在某个页上做了什么修改。
在这里插入图片描述
其实写redo log的时候,也会有buffer,是先写buffer,再真正落到磁盘中的。至于从buffer什么时候落磁盘,会有配置供我们配置。
在这里插入图片描述
写redo log也是需要写磁盘的,但它的好处就是顺序IO(我们都知道顺序IO比随机IO快非常多)。

所以,redo log的存在为了:当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以根据redo log来对数据进行恢复。因为redo log是顺序IO,所以写入的速度很快,并且redo log记载的是物理变化(xxxx页做了xxx修改),文件的体积很小,恢复速度很快

4.bin log和redo log的区别

(1)存储的内容

  • bin log记录InnoDB、MyISAM等存储引擎的日志。记载的是数据的逻辑变化,所有执行的DDL和DML语句(除了数据查询语句select、show等)
  • redo log记录InnoDB存储引擎的日志。记载的是数据的物理变化,物理修改内容(xxxx页修改了xxx)

(2)功能

  • bin log:主从复制和恢复
    • 主从服务器需要保持数据的一致性,通过bin log来同步数据。
    • 如果整个数据库的数据都被删除了,bin log存储着所有的数据变更情况,那么可以通过bin log来对数据进行恢复。
  • redo log:持久化
    • 写完内存,如果数据库挂了,那我们可以通过redo log来恢复内存还没来得及刷到磁盘的数据,将redo log加载到内存里边,那内存就能恢复到挂掉之前的数据了。
  • 如果整个数据库的数据都被删除了,那我可以用redo log的记录来恢复吗?
    • 不能。因为功能的不同,redo log 存储的是物理数据的变更,如果我们内存的数据已经刷到了磁盘了,那redo log的数据就无效了。所以redo log不会存储着历史所有数据的变更,文件的内容会被覆盖的。

(3)写入时间

  • bin log:仅在事务提交前进行提交,也就是只写磁盘一次。
  • redo log:事务进行的过程中不断写入。

(4)写入方式

  • bin log:追加写入,不会覆盖已经写的文件。
  • redo log:循环写入和擦除。

5.两阶段提交

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

从上图可以看出,MySQL在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对binlog进行写入,在InnoDB内进行redo log的写入。

不仅如此,在对redo log写入时有两个阶段的提交,一是binlog写入之前prepare状态的写入,二是binlog写入之后commit状态的写入。
在这里插入图片描述

6.undo log的作用

undo log主要有两个作用:

  • 回滚
  • 多版本控制(MVCC)

在数据修改的时候,不仅记录了redo log,还记录undo log,如果因为某些原因导致事务失败或回滚了,可以用undo log进行回滚

undo log主要存储的也是逻辑日志,比如我们要insert一条数据了,那undo log会记录的一条对应的delete日志。我们要update一条记录时,它会记录一条对应相反的update记录。

这也应该容易理解,毕竟回滚嘛,跟需要修改的操作相反就好,这样就能达到回滚的目的。因为支持回滚操作,所以我们就能保证:“一个事务包含多个操作,这些操作要么全部执行,要么全都不执行”。【原子性】

因为undo log存储着修改之前的数据,相当于一个前版本,MVCC实现的是读写不阻塞,读的时候只要返回前一个版本的数据就行了。

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

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

相关文章

springcloud3 fegin实现服务调用1

一 Fegin的作用 1.1 fegin的作用 fegin是一个声明式的web服务客户端,让编写web服务器客户端变得非常容易,只需创建一个接口并在接口中添加FeginClients注解即可。 Fegin的使用方式:使用fegin的注解定义接口,调用这个接口&#…

BI软件工具也有ChatGPT

ChatGPT最近大火,朋友圈、聊天群啊到处都在分享它、讨论它。我也凑了个热闹,先和它聊了一下孩子学习上的困惑,然后用它给孩子出了一套易错题型的练习题,缓解了我做为熊孩子家长的压力。ChatGET能做的可不止这些,还能写…

MTK平台开发入门到精通(休眠唤醒篇)休眠唤醒LPM框架

文章目录 一、lpm驱动源码分析二、设备属性调试文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 lpm 驱动源码分析。 mtk 平台下,其默认的 lpm 机制的源码位置:drivers/misc/mediatek/lpm/ 一、lpm驱动源码分析 目录:drivers/misc/mediatek/lpm/…

aardio 编程语言

今天看到一篇文章《独自坚持 17 年,aardio 作者:“因妻子患癌,再无精力维护项目”》,才知道有个这个项目,也算是很有情怀的一个开发者,对程序有着真挚的热忱,aardio 🔊 专注于桌面软…

Unity Avatar Cover System - 如何实现一个Avatar角色的智能掩体系统

文章目录简介变量说明实现动画准备动画状态机State 状态NoneStand To CoverIs CoveringCover To Stand高度适配高度检测脚部IK简介 本文介绍如何在Unity中实现一个Avatar角色的智能掩体系统,效果如图所示: 初版1.0.0代码已上传至SKFramework框架Package…

数据库系统-关系模式

二、DB的抽象与演变 2.1 DB的标准结构 DBMS管理数据的三个层次 ● (局部模式)Entrenal Level 外部层次 User Level 用户层次 ○ 用户能够看到雨处理的数据,全局数据中的某一部分 ● (全局模式)Conceptual Level 概念层次 Logic Level 逻辑层次 ○ 从全局角度理解…

【Linux】编译器gcc g++和调试器gdb的使用

文章目录1.编译器gcc/g1.1C语言程序的翻译过程1.预处理2.编译3.汇编4. 链接1.2 链接方式与函数库1.动态链接与静态链接2.动态库与静态库1.3 gcc与g的使用2.调试器gdb2.1debug和release2.2gdb的安装2.3gdb的使用2.4gdb的常用指令3.总结1.编译器gcc/g 1.1C语言程序的翻译过程 1…

一个ELF文件分析和逆向的过程

CrackMe1、2分析和逆向的过程 1. CrackMe1、2相关信息 CrackMe1 1、CrackMe1是一个ELF可执行文件,可在Android中独立执行 2、通过adb(Android SDK中默认带有adb工具)将CrackMe1 push到远程Android设备中,建议放在/data/local/tmp目录下 3、打开adb shel…

关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

一、常见故障介绍  最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行5个来月以来首次出现msvcr100.dll故障等问题,于是乎开始了分析之路,按照度娘上的一顿操作,期间也是出现了各种不一样的问…

Lombok常见用法总结

目录一、下载和安装二、常见注释(一)Data(二)Getter和Setter(三)NonNull和NotNull(不常用)(四)ToString(不常用)(五&#…

一款丧心病狂的API测试工具:Apifox!

你好,我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题(测试入门、技术、python交流都可以) 我们平时在做接口测试的时候,对于一些常用的接口测试工具的使用应该都非常熟悉了: 接口文档:Swagge…

Databend 开源周报 第 83 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Support for WebHDFSHDFS 是大数…

ArrayList集合底层原理

ArrayList集合底层原理ArrayList集合底层原理1.介绍2.底层实现3.构造方法3.1集合的属性4.扩容机制5.其他方法6.总结ArrayList集合底层原理 1.介绍 ​ ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在 内的所有元素。 每个 Array…

静态库和动态库的打包与使用

静态库和动态库 静态库和动态库的打包 生成可执行程序时链接使用 运行可执行程序时加载使用 提前声明,笔者示例的文件有mian.c/child.c/child.h。OK,我们先了解一下,库文件是什么?它其实就是打包了一堆实现常用功能的代码文件. ⭐…

Python之re库用法细讲

文章目录前言一、使用 re 模块的前期准备工作二、使用 re 模块匹配字符串1. 使用 match() 方法进行匹配2. 使用 search() 方法进行匹配3. 使用 findall() 方法进行匹配三、使用 re 模块替换字符串四、使用 re 模块分割字符串总结前言 在之前的博客中我们学习了【正则表达式】的…

C++ typedef用法详解

typedef的4种常见用法:给已定义的变量类型起个别名定义函数指针类型定义数组指针类型为复杂的声明定义一个新的简单的别名总结一句话:“加不加typedef,类型是一样的",这句话可以这样理解:没加typedef之前如果是个…

云原生架构设计原则及典型技术

云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等…

Apk加固后多渠道打包

之前一直使用360加固宝进行apk的加固打包,可以一键加固并打多渠道打包。但是,现在360加固宝收费了,在进行加固,多渠道打包,就得一步一步自己操作了,会很繁琐。所以,本文使用 360加固美团Wallet …

c++11 标准模板(STL)(std::unordered_map)(五)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

Java开发 - 单点登录初体验(Spring Security + JWT)

目录​​​​​​​ 前言 为什么要登录 登录的种类 Cookie-Session Cookie-Session-local storage JWT令牌 几种登陆总结 用户身份认证与授权 创建工程 添加依赖 启动项目 Bcrypt算法的工具 创建VO模型类 创建接口文件 创建XML文件 补充配置 添加依赖 添加配…