MySQL执行更新SQL流程

embedded/2025/3/6 0:14:56/

目录

1 redo log

2 binlog

3 Update执行逻辑


1 redo log
  • InnoDB引擎特有日志
  • MySQL的WAL(Writing Ahead logging)技术,预写式日志,先写日志再写磁盘
  • 当有一条记录需要更新时,InnoDB引擎就会先把记录写在redo log日志中,然后在后面系统比较空闲的时候,将这个操作记录更新到磁盘里面
  • 记录的是物理日志,在某个数据页上做了什么修改
  • 空间大小固定,循环写入

redo日志相关配置

  • innodb_log_file_size:配置单个redo日志文件大小
  • innodb_log_files_in_group:配置redo日志文件个数
  • innodb_log_buffer_size:redo日志内存缓冲区大小
  • innodb_flush_log_at_trx_commit:redo日志缓冲区数据落盘时机
    • 0:每秒将redo日志缓冲区内容写入到文件系统缓存,再同步到磁盘
    • 1:每次提交时立即将redo日志缓冲区内容写入到文件系统缓存,再同步到磁盘
    • 2:每次提交立即将redo日志缓冲区内容写入到文件系统缓存,不立即同步到磁盘,由操作系统决定何时同步到磁盘

  • write pos是当前记录的位置,一边写一边后移,写到3号文件结尾时,就回到0号文开头
  • checkpoint是当前要同步磁盘的开始位置,边将数据同步到磁盘一边向后移动
  • wirte position和checkpoint之间是空闲位置,可以用来记录更新操作
  • 当wirte position追上checkpoint时,得先推进下checkpoint位置,才能继续写更新记录
  • redo log可以保证在数据库发生异常的情况下重启,之前提交的记录都不会丢失,这个能力称之为crash-safe
2 binlog
  • MySQL Server层的日志,也称为归档日志
  • 所有的存储引擎都可以使用
  • 主要用于归档,是逻辑日志,记录的是SQL语句
  • 追加写入,达到设置阈值时,切换新的binlog文件

binlog日志相关配置

  • server-id:开启binlog时,必须设置的唯一id
  • log-bin:配置binlog文件路径和前缀
  • binlog-format:指定binlog日志的格式
    • ROW:记录每一行的变化,占用空间大,但是记录的数据完整准确
    • STATEMENT:记录执行的SQL语句,sql中包含函数执行时会导致主从数据不一致问题
    • MIXED:根据情况自动选择ROW或者STATEMENT

expire_logs_day:设置binlog日志文件的保留天数,默认0,表示不删除旧的日志文件

max_binlog_size:设置单个binlog日志文件的最大大小,当达到该值时,会生成一个新的日志文件

binlog日志的操作

  • show master status:查看当前的日志文件及位置
  • purge binary logs:手动清理日志文件
    • purge binary logs to 'sql>mysql-bin.0000010':删除到指定文件之前的日志
    • purge binary logs before '2025-03-01 00:00:00':删除到指定日期之前的日志
  • show binary logs:查看binlog日志文件列表
  • show binlog events:查看第一个binlog日志内的事件
  • show binlog events in 'sql>mysql-bin.0000010':查看指定binlog日志文件中的事件

binlog解析的工具

3 Update执行逻辑

执行update语句内部流程

  • 执行存储引擎获取id=1的这一行,
  • 存储引擎使用索引进行查找如果id=1这一行所在数据本来就在内存就直接返回给执行器,否则先从磁盘内存然后返回
  • 执行器拿到存储引擎给的数据name设置lose得到新的一行数据调用存储引擎写入这行数据
  • 存储引擎更新数据更新内存同时更新操作记录redo log此时redo log处于prepare状态告知执行器执行完了随时可以提交事务
  • 执行生成这个操作binlog并把binlog写入磁盘
  • 执行器调用存储引擎提交事务接口刚刚写入redo log改成提交commit)状态此时更新完成

执行更新流程图

MySQL两阶段提交

  • prepare阶段
    • 数据写入redo log
    • 数据写入binlog
  • commit阶段
    • binlog提交commit请求
    • 调用innodb引擎发送commit请求

那么MySQL如何识别哪些提交属于一个事务呢?

  • redo logbinlog包含xid信息xid事务idMySQL实例全局唯一

崩溃恢复如何做呢?

  • redo log事务完成已经有了commit标识直接提交事务
  • redo log只有完整prepare没有commit标识此时需要binlog查找
    • 如果binlog已经commit提交事务
    • 如果binlog没有commit回滚事务

http://www.ppmy.cn/embedded/170335.html

相关文章

代码随想录算法训练营day49(0217)

单调栈的收尾,接雨水很常考 1.接雨水 题目 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台

2025-02-27,由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境,设计了更具挑战性和实用性的交互任务,目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来,基于大型语言模型的智能体系统在复…

[密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践

一、代码运行结果 二、国密算法与密钥协商背景 2.1 什么是国密算法? 国密算法是由中国国家密码管理局制定的商用密码标准,包括: SM2:椭圆曲线公钥密码算法(非对称加密/签名/密钥协商)SM3:密码…

基于微信小程序的停车场管理系统的设计与实现

第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…

Docker项目部署-部署Java应用

总结 部署一个Java项目需要做什么事情。 1.首先需要将项目打包,打包完得到jar包。 2.把打包得到的jar包和Dockerfile一起放到虚拟机里。 3.利用命令docker build -t 镜像名 . 构建镜像。 4.最后利用docker run 去部署应用。

DeepSeek系列 清华大学-AIGC发展研究3.0版 pdf完整版(附下载)

DeepSeek系列 清华大学-AIGC发展研究3.0版.pdf https://pan.baidu.com/s/1JraW2e102XuegrCGxsW26w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/b3a081614658 清华大学《AIGC发展研究3.0版》报告由新闻学院与人工智能学院联合完成,系统梳理了AIGC领域的前…

sql-labs靶场笔记

基本步骤 SQL注入的基本流程 1.1 判断注入点 输入点分析:首先,需要识别应用程序中的输入点,包括用户输入的表单字段、URL参数、Cookie等。 尝试注入:在识别到可能的注入点后,可以尝试在这些输入点中插入一些特殊字符…

Deepseek对ChatGPT的冲击?

从测试工程师的视角来看,DeepSeek对ChatGPT的冲击主要体现在**测试场景的垂直化需求与通用模型局限性之间的博弈**。以下从技术适配性、效率优化、风险控制及未来趋势四个维度展开分析: --- ### **一、技术适配性:垂直领域能力决定工具选择…