Sql执行流程与Redo log、 Undo log、 Bin log日志文件

news2025/7/19 9:01:48

文章目录

  • Sql执行流程与日志文件
      • Sql的执行流程
      • Redo Log
      • Bin log
      • Undo log

Sql执行流程与日志文件

Sql的执行流程

mysql的内部组件结构如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVYe7ayq-1678202724710)(picture/性能调优/127990)]

  • 连接器

    与客户端建立连接,检验登录密码,分配相应权限

  • 查询缓存

    执行sql语句时会先从这里找一下,这里数据的存储格式是key-value,key是sql语句,value是查询结果。只有当sql语句和查询缓存中的sql语句完全一致才会匹配成功,并且只要对表进行了更新操作就会清除查询缓存中的内容。mysql8.0已经移除了查询缓存

  • 词法分析器

    对sql语句进行解析,进行相应语法校验,一条select查询语句经过分析后的结果如下图所示

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7v9wtJR1-1678202724710)(picture/性能调优/127943)]

  • 优化器

    Mysql自动对sql语句进行相应的优化,存在多个索引时决定使用哪一个,多个表连接查询时决定谁驱动谁

  • 执行器

    开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

当使用InnoDB存储引擎执行一条update语句的大致流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smB7WHHD-1678202724711)(picture/性能调优/129428)]

经过server层后就到存储引擎层了,

  • 首先去Buffer pool中查询当前数据所在的页是否在缓存池中,如果在就直接操作,如果不在就去磁盘中找到并把整页数据赋值到Buffer Pool中
  • 在进行更新操作前先生成Undo log文件
  • 更新内存中的数据
  • 更新完成后会写Redo log到redo log buffer中
  • redo log buffer就经过它相应的刷盘策略 持久化到磁盘的Redo log文件中
  • 事务提交前,默认情况下会对Redo log进行持久化操作,还会生成bin log文件写入磁盘中
  • redo log 与 bin log此时都已经持久化到磁盘中了,此时会写一个commit标记到redo log日志文件中




Redo Log

当进行更新操作时就会生成redo log文件,它是用来保证事务的持久性的,事务提交前就会把内存中的redo log写入到磁盘中

redo log刷盘策略

  • mysql线程以秒为单位将内存中的日志刷新到磁盘

  • Redo log Buffer缓存池使用了1/2,就触发刷盘机制

  • 默认情况下事务提交前,由innodb_flush_log_at_trx_commit这个变量的值来决定提交时是否持久化redo log

  • 当磁盘中Redo log文件不可重写部分占了75%容量时,就触发刷新Buffer pool中脏页的机制

关键参数

  • innodb_log_buffer_size

    设置redo log buffer大小参数,默认16M ,最大值是4096M,最小值为1M。

    show variables like '%innodb_log_buffer_size%';
    

  • innodb_log_group_home_dir

    设置redo log文件存储位置参数,默认值为"./",即innodb数据文件存储位置,其中的 ib_logfile0 和 ib_logfile1 即为redo log文件。

    show variables like '%innodb_log_group_home_dir%';
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKgNmu9A-1678202724711)(picture/性能调优/image-20230302082313663.png)]

  • innodb_log_files_in_group

    设置redo log文件的个数,命名方式如: ib_logfile0, iblogfile1… iblogfileN。默认2个,最大100个。

    show variables like '%innodb_log_files_in_group%';
    

  • innodb_log_file_size

    设置单个redo log文件大小,默认值为48M。最大值为512G,注意最大值指的是整个 redo log系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。

    show variables like '%innodb_log_file_size%';
    

  • innodb_flush_log_at_trx_commit

    这个参数控制 redo log 的写入策略,它有三种可能取值:

    • 设置为0:表示每次事务提交时都只是把 redo log 留在 redo log buffer 中,等Mysql线程去进行刷盘操作,数据库宕机可能会丢失数据。
    • 设置为1: 默认值,每次提交事务时都将redo log buffer中同步写到磁盘,当然这里是先写到操作系统的page cache中,在写到磁盘
    • 设置为2:每次提交事务时都将redo log buffer中异步写到磁盘,这里是写到操作系统的page cache中,如果数据的宕机但是操作系统没有挂数据还是存在的


Redo log 写入磁盘文件大致过程

是交替循环写多个文件,写满一个文件后写下一个文件,但最后一个文件写满后又写第一个文件,大致如下图所示:

write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。

checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件里。

write pos 和 checkpoint 之间的部分就是空着的可写部分,可以用来记录新的操作。如果 write pos 追上checkpoint,表示redo log写满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。




Bin log

当数据库进行更新操作时,就会记录相应操作到Bin log文件中,它的作用是:数据恢复、主从复制

在mysql5.7中Binlog默认是关闭的,在Mysql8.0版本中默认是开启的,

# 查看binlog相关参数
show variables like '%log_bin%';

log_bin的值是OFF就代表binlog是关闭状态,打开binlog功能,需要修改配置文件my.cnf,然后重启数据库。

# log-bin设置binlog的存放位置,可以是绝对路径,也可以是相对路径,这里写的相对路径,则binlog文件默认会放在data数据目录下
log-bin=mysql-binlog
# Server Id是数据库服务器id,随便写一个数都可以,这个id用来在mysql集群环境中标记唯一mysql服务器,集群环境中每台mysql服务器的id不能一样,不加启动会报错
server-id=1
# 其他配置
binlog_format = row # 日志文件格式,下面会详细解释,推荐使用MIXED混合模式
expire_logs_days = 15 # 执行自动删除距离当前15天以前的binlog日志文件的天数, 默认为0, 表示不自动删除
max_binlog_size = 200M # 单个binlog日志文件的大小限制,默认为 1GB

重启mysql服务后再通过上面的命令查看结果如下,此时就表示binlog已经开启了


Binlog的日志格式

mysql支持三种

  • STATEMENT:直接报错执行的sql语句,日志量小,节约IO开销,提高性能,如果此时执行UUID()、SYSDATE()等函数就会造成主从数据不一致问题
  • ROW:日志会记录每一行具体修改的值,但对于范围型的更新操作则会生成非常多的数据,比如更新id>10,这个时候就会为每一行数据都生成一条binlog
  • MIXED:混合模式,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种,如果sql里有函数或一些在执行时才知道结果的情况,会选择Row,其它情况选择Statement,推荐使用这一种。

binlog写入磁盘机制

binlog写入磁盘机制主要通过 sync_binlog 参数控制,默认值是 0。

  • 为0的时候,表示每次提交事务都只 write 到page cache,由系统自行判断什么时候执行 fsync 写入磁盘。虽然性能得到提升,但是机器宕机,page cache里面的 binlog 会丢失。
  • 也可以设置为1,表示每次提交事务都会执行 fsync 写入磁盘,这种方式最安全。
  • 还有一种折中方式,可以设置为N(N>1),表示每次提交事务都write 到page cache,但累积N个事务后才 fsync 写入磁盘,这种如果机器宕机会丢失N个事务的binlog。

binlog 文件重新生成策略

  • 执行flush logs;命令
  • mysql服务重启
  • 单个文件记满

删除binlog日志

删除当前的binlog文件
reset master;
# 删除指定日志文件之前的所有日志文件,下面这个是删除6之前的所有日志文件,当前这个文件不删除
purge master logs to 'mysql-binlog.000006';
# 删除指定日期前的日志索引中binlog日志文件
purge master logs before '2023-01-21 14:00:00';

查看 binlog 日志文件

binlog文件中默认记录的是二进制的数据,可以使用如下方式进行查询其中的内容

# 查看bin-log二进制文件(命令行方式,不用登录mysql)
mysqlbinlog --no-defaults -v --base64-output=decode-rows D:/dev/mysql-5.7.25-winx64/data/mysql-binlog.000007 

# 查看bin-log二进制文件(带查询条件)
mysqlbinlog --no-defaults -v --base64-output=decode-rows D:/dev/mysql-5.7.25-winx64/data/mysql-binlog.000007 start-datetime="2023-01-21 00:00:00" stop-datetime="2023-02-01 00:00:00" start-position="5000" stop-position="20000"

在binlog文件中每一个 BEGIN 或者是COMMIT 上下都有一个表示位置的数,比如 \# at 766,可以拿到这个偏移量去进行数据恢复


binlog日志文件恢复数据

思路是首先通过上面的命令查看到binlog文件的内容,找到要恢复的一个起始和结束位置,在执行数据恢复命令,或者是直接执行整个binlog文件

mysqlbinlog  --no-defaults --start-position=219 --stop-position=701 --database=test D:/dev/mysql-5.7.25-winx64/data/mysql-binlog.000009 | mysql -uroot -p123456 -v 数据库名




Undo log

InnoDB对undo log文件的管理采用段的方式,也就是回滚段(rollback segment) 。每个回滚段记录了 1024 个 undo log segment ,每个事务只会使用一个undo log segment。

在MySQL5.5的时候,只有一个回滚段,那么最大同时支持的事务数量为1024个。在MySQL 5.6开始,InnoDB支持最大128个回滚段,故其支持同时在线的事务限制提高到了 128*1024 。


undo log日志什么时候删除

新增类型的,在事务提交之后就可以清除掉了。

修改类型的,事务提交之后不能立即清除掉,这些日志会用于mvcc。只有当没有事务用到该版本信息时才可以清除。

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

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

相关文章

雷电模拟器运行非常卡顿有效解决方法分享

雷电模拟器运行非常卡顿有效解决方法分享。有用户在电脑上开启雷电模拟器来使用的时候,遇到了软件使用非常卡顿的情况。那么这样的软件卡顿问题要怎么去进行处理呢?接下来我们一起来看看以下的解决方法教学吧。 雷电模拟器卡顿的解决方法 一、关闭360核晶…

华大(小华)HC32L130工程创建

一、我们先来认识一下华大驱动库包下的文件功能。注意,华大提供的包是没有M0内核标准文件的,(HC32L130 是M0)ST提供的驱动库包是有的,就是CORE文件夹。第一步:创建文件夹目录具体这个创建文件夹目录的含义可…

matlab基础到实战(1)

目录概述sin函数例子四则运算实数复数逻辑运算复数运算模幅角共轭向量二维向量定义序列生成向量向量索引方式加减乘除向量间运算加减乘法除法概述 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理…

基于阿里云物联网平台设计的实时图传系统_采用MQTT协议传输图像

一、项目功能介绍 当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服…

0106广度优先搜索和最短路径-无向图-数据结构和算法(Java)

1 单点最短路径 单点最短路径。 给定一幅图和一个起点s,回答“从s到给定目的顶点v是否存在一条路径?如果有,找出其中最短的那条(所含边数最少)。“等类似问题。 深度优先搜索在这个问题上没有什么作为,因为…

个人创业做什么好?哪些互联网创业项目可长期收益?

打工没前途,这是现在年轻人看透了的一个事情,日复一日地工作,不如自己创业挣钱,那么个人创业做什么好呢?哪些项目可以长期稳定收益呢? 一、高体力项目不要做; 创业项目有很多,尤其是…

RK3588平台开发系列讲解(同步与互斥篇)自旋锁介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、自旋锁介绍二、自旋锁相关的函数1、普通场景2、进程上下文和下半部3、中断相关三、相关结构体四、函数实现1、初始化2、获取自旋锁沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇介绍自旋锁的使用和基…

Clickhouse数据去重

1. Hive去重 先以两个简单的sql启发我们的话题 select count(distinct id)from order_combine;select count(id) from (select id from order_combine group by id ) t;从执行日志当中我们可以看到二者的差异(只摘取关键部分) # distinctStage-Stage…

kube-scheduler

kube-scheduler,它是 k8s 的默认调度器,负责为新创建出来的 pod寻找一个最合适的节点,这里的“最合适”指两种最优解:从集群中的所有节点中找出的全局最优解,和从集群中的部分节点中找出的局部最优解。它们分别可以解决…

电气系统中防雷接地保护的综合解决方案

防雷接地保护是通过导体和接地,可靠地连接一种保护性接线方法,在该保护性接线方法中,可能会在绝缘材料损坏后或在其他情况下对电器的金属部分(即与带电部分绝缘的金属结构部分)进行绝缘。接地保护系统仅具有相线和零线…

VSCode使用技巧,代码编写效率提升2倍以上!

VSCode是一款开源免费的跨平台文本编辑器,它的可扩展性和丰富的功能使得它成为了许多程序员的首选编辑器。在本文中,我将分享一些VSCode的使用技巧,帮助您更高效地使用它。 1. 插件 VSCode具有非常丰富的插件生态系统,通过安装插…

大数据分析案例-基于逻辑回归算法构建微博评论情感分类模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)

前言 本文是HTML零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文章目录前言十五.HTML布局1.使用div元素添加网页布局2.使用table元素添加网页布局十六.HTML表单和输入1.文本域2.密码字段3.单选按钮4.复选框5.提交按钮十七.HTML框架1.iframe语法2.iframe设置…

java中如何判断map是否为空

java中判断map是否为空的方法是:利用isEmpty()函数来判断。函数介绍:isEmpty()是Java中用于判断某种容器是否有元素的系统库函数。如用来判断ArrayList,HashSet,HashMap是否有元素等。在Java中,可以用isEmpty();判断一…

燃料电池聚合物电解质膜高低温退化性能测试中的TEC半导体制冷温控解决方案

摘要:针对燃料电池质子交换膜高低温退化机理表征,基于德国慕尼黑工业大学团队提出的替代环境试验箱的TEC半导体制冷温控方案及其功能指标,本文给出此方案具体实施内容的补充,详细介绍了用于TEC半导体制冷温控系统的PID调节器和大功…

Springboot项目连接neo4j数据库

首先创建一个springboot项目&#xff0c;这里不再介绍。1 导入依赖包连接neo4j数据库的依赖包<dependency><groupId>org.neo4j</groupId><artifactId>neo4j-ogm-http-driver</artifactId><version>2.1.5</version> </dependency&…

人工智能算法几个重要指标

一、几个前置概念 TP&#xff08;True Positive&#xff09;&#xff1a;正确的正例&#xff0c;正类被判定成正类 FN&#xff08;False Negative&#xff09;&#xff1a;错误的反例&#xff0c;漏报&#xff0c;正类被判定为假类 FP&#xff08;False Positive&#xff09…

dp之数位dp---(度的数量)

题目&#xff1a; 思路&#xff1a; 首先对题目意思进行分析&#xff1a;恰好等于 K 个互不相等的 B 的整数次幂之和&#xff0c;这句话的意思是说对于某一个B进制数x说&#xff0c;x只有k位上只有1&#xff0c;其他位都为0。然后让你求区间[X,Y]的满足条件的数字有多少&#x…

MyBatis开发详解

MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objects&am…

信息系统基本知识(五)信息系统安全技术

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.6 信息系统安全技术 1.6.1 信息系统安全的有关概念 信息安全的概念&#xff1a;信息安全强…