MySQL之binlog、redolog、undolog

news2024/11/23 20:21:46

1.binlog是 mysql server 层的一种二进制日志,用来记录数据库的写入操作,并以"事务"的形式保存在磁盘上,主要的使用场景有主从复制和数据恢复。

2.redo log (重做日志)是InnoDB存储引擎产生的,记录事务对数据页的修改,如果mysql挂了,重启后InnoDB会使用redo log恢复数据,保证了数据的持久性。

3.InnoDB事务修改数据之前会记录undo log并且持久化,undo log通过回滚事务指针形成了链表

一、binlog

binlog是 mysql server 层的一种二进制日志,用来记录数据库的写入操作,并以"事务"的形式保存在磁盘上,主要的使用场景有主从复制和数据恢复。

日志格式

  • statement:记录了SQL语句原文,但是类似 set update_time=now() 这种情况,可能会导致主从数据不一致
  • row:记录SQL涉及到的每行数据的修改,缺点是会产生大量的日志,mysql 5.7.7之后默认 row 模式
  • mixed:两种方案折中,MySQL会判断这条SQL语句是否会引起数据不一致,如果是,就用row模式,否则就用statement模式

写入流程

事务执行过程中,会先把日志写到binlog cache,事务提交的时候,再根据刷盘规则将binlog cache写入文件。

系统会给每个线程分配一个 binlog cache ,可以通过 binlog_cache_size 参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘。

write:将 mysql 缓存写到文件系统的 page cache,并没有把数据持久化到磁盘,速度比较快
fsync:文件系统的 page cache 持久化到磁盘

刷盘时机

  • 0:每次提交只 write,由系统判断什么时候执行 fsync,如果宕机page cache里面的binlog会丢失
  • 1: 每次提交事务都会执行 write + fsync ,MySQL 5.7.7 之后默认为1
  • N:每次提交事务都write,但累积N个事务后才fsync ,如果宕机会丢失N个事务的binlog

主从复制

  • salve的IO进程连接上master,并请求指定binlog文件指定位置之后的内容
  • master接到请求后,负责复制的IO进程读取并返回指定的binlog内容,包括binlog文件名称和位置
  • salve将binlog日志添加到relay-log文件,并记录日志文件名称和位置
  • salvesql 进程检测到relay-log新增内容后,解析binlog并执行

相关参数配置

# 开启binlog 存放位置
log-bin = mysql-bin
# 最大的大小
max_binlog_size = 1G
# binlog的刷盘时机
sync-binlog = 1
# binlog的格式
binlog-format = ROW
# 保留七天的binlog
expire_logs_days = 7
#查看binlog
mysqlbinlog: /var/bin/mysqlbinlog mysql-bin.000001
#数据恢复
mysqlbinlog --start-position=10000 --stop-position=15000 mysql-bin.000001 > history.sql

二、redo log

redo log (重做日志)是InnoDB存储引擎产生的,记录事务对数据页的修改,如果mysql挂了,重启后InnoDB会使用redo log恢复数据,保证了数据的持久性。

每条 redo 记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成

写入流程

为了提高性能,mysql使用了buffer pool,查询数据时,先从buffer pool查,如果不存在,就会从磁盘读取数据页放到buffer pool,更新数据同样,直接更新buffer pool中的数据页,此时内存中的数据页和磁盘上的就不一致了,出现了脏页,mysql会在合适的时机将脏页刷到磁盘,但是万一脏页还没刷到磁盘,mysql宕机,此时buffer pool中还没来得及落盘的数据就丢失了,所以在更新buffer pool之前就会把 “事务在某个数据页上做了什么修改”记录到redo log,这就是WAL(Write Ahead Log)

刷盘时机

redo log 为了提高性能也使用了缓存redo log buffer ,可以通过 innodb_flush_log_at_trx_commit 来配置刷盘策略,默认 = 1 ,不会丢数据。除了事务提交时刷盘,InnoDB存储引擎还有一个后台线程,每隔1秒,执行一次 write + fsync 刷盘。

  • 0 :每次事务提交时不进行刷盘操作,mysql挂了会丢失1秒数据
  • 1 :每次事务提交时都将进行刷盘操作 write + fsync,不会丢数据
  • 2 :每次事务提交时只执行write,mysql挂了不会丢数据,服务器挂了会丢失1秒数据

还有一种情况,当redo log buffer占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动刷盘

日志文件

redo log默认情况下存储在data目录下ib_logfile0 、ib_logfile1,可以通过 innodb_log_file_size 设置大小, innodb_log_files_in_group 设置文件个数,比如可以配置为一组4个文件,每个文件的大小是 1GB,整个redo log 日志文件组可以记录4G的内容,

redo log是循环写的,write pos是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头,checkpoint是当前要擦除的位置,也是往后推移并且循环的,脏页刷盘,checkponit往后移。

每个数据页都有一个LSN,redo log 中也记录了LSN,当数据库异常重启时,系统读取redo log并定位到checkpoint位置,如果此时当redo log中的LSN大于数据页中的LSN,说明redo log中的数据未完全写入数据页中,那么将从数据页中记录的LSN开始,从redo log中恢复数据。比如redolog 的LSN 是 13000,数据库页的LSN是 10000,那么系统将会恢复redo log 中LSN从10000开始到13000的记录到数据页中。当redo log中的LSN小于数据页中的LSN时,说明数据页已经被刷到该位置,所以不需要进行恢复。

二阶段提交

InnoDB事务提交之前并不是直接写redo log,而是使用了二阶段提交,将redo log的写出拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

为什么要使用两阶段提交呢?假设没有redo log直接提交:

1、先写binlog,mysql崩溃,事务回滚,但是binlog已经写入,同步到从库,最终导致主从不一致。
2、先写redo log,mysql崩溃,重启,通过redo log恢复事务,但是binlog里并没有这个事务,主从不一致,如果通过binlog来恢复数据,也会丢失事务。

再来看看两阶段提交:

1、如果写入redo log prepare阶段之后,mysql崩溃,重启, redo log prepare+binlog不完整,回滚事务。
2、如果在写入binlog之后,mysql崩溃,重启,redo log prepare + binlog完整,事务提交,恢复数据。

可以看到 redo log prepare阶段+完整的binlog就能保证mysql的崩溃恢复了。

崩溃恢复

再来看看完整的崩溃恢复流程

binlog能不能崩溃恢复?

不可以,因为binlog是追加写入的,只要开启了binlog,所有的更新记录都会被写入,保存的是全量的日志, InnoDB不能区分出哪些数据已经刷盘,哪些还没有。而redo log是循环写的,checkpoint 和 write pos 之间的 redo log都是未刷入磁盘的日志。

三、undo log

InnoDB事务修改数据之前会记录undo log并且持久化,undo log通过回滚事务指针形成了链表。undo log 有三个使用场景 1.通过rollback主动回滚事务, 2:MVCC ,3.崩溃恢复未完成的事务通过undo log回滚。

undo log 日志有两种 insert 类型 和 update 类型,insert 类型记录了主键id,update 类型记录了修改前的数据

INSERT INTO t (id, a) VALUES (1, “A”); 
UPDATE t SET a=“B” WHERE id = 1; 
UPDATE t SET a=“C” WHERE id = 1;

事务3 回滚 ,会将数据回滚到事务2修改后,而事务2想回滚它会将数据回滚到事务1插入后的状态,事务1回滚就会删除插入的记录。

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

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

相关文章

day30-Oracle函数

Oracle函数 1.oracle字符函数 1.1 拼接函数concat 1.2 首字母转大写initcap 1.3 lower转小写;upper转大写 1.4 trim去除首尾空格 1.5 substr截取字符串3,4,3代表从第三个字符开始,4代表共截取4个字符 1.6 replace替换字符串 2.oracl…

局部均方差滤波(磨皮)

note 锚点灰度值 用 原图像对应点的原灰度值 和 局部均值加权得到 局部均值 由 掩膜 区域计算得到 权重 由 局部方差 与用户输入参数计算确定 code // 局部均方差滤波 /*\brief 局部均方差滤波\param src:原矩阵,单通道\param res:结果矩阵\param size:掩膜矩形…

Linux学习之磁盘分区(fdisk、parted、df)、文件大小查看(ls、du)和文件写入(dd)

我用来演示的系统使用CentOS Linux release 7.9.2009 (Core),内核版本是3.10.0-1160.71.1.el7.x86_64。 fdisk fdisk -l可以查看分区,因为我这里使用的不是root用户,所以前边加上sudo。 可以看到当前只有sda一块磁盘,第二磁盘…

全志V3S嵌入式驱动开发(软、硬件调试方法总结)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 v3s开发板本身是比较小巧的,ddr也是嵌入在soc里面的,电路设计也不复杂,因此很受电子爱好者的喜欢。不过大部分朋…

对话小红书剑寒:如何跨方向技术融合,全局优化打造更智能的音视频系统?...

编者按:在 AI 时代,随着 ChatGPT 掀起技术狂潮,构建更智能的音视频系统已经成为音视频领域从业者的共同目标。 然而,音视频系统的智能化,每个从业者对其都有自己独特的视角和理解,正如“一千个人眼中有一千…

华为官宣2024年推出面向商用的5.5G全套网络设备

2023年6月29日华为董事、ICT产品与解决方案总裁杨超斌在2023 MWC上海展5G Advanced论坛上宣布,2024年,华为将会推出面向商用的5.5G全套网络设备。这也标志着ICT行业即将迈入5.5G时代。 经过四年的高速发展,5G建设已经取得了丰硕的成果。目前…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册7

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

MySql的操作跟命令

概述 仅仅为了加强记忆,废话不说,直接上正文。 快速开始 创建数据库。 进入MySql客户端,输入root用户的密码 Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server vers…

第3章 创建项目并初始化业务数据(过程记录)

项目声明和依赖 ECommerceRecommendSystem [pom.xml] 公用的声明、依赖、插件 properties 声明 log4g:处理日志的框架(日志的具体实现)sel4g:简单日志门面(简单日志的接口)mongodb-spark:Mong…

Python 元类实现ORM

目录 ORM概念 __new__、__init__、__call__的介绍 通过元类简单实现ORM中的insert功能 抽取到基类中 ORM概念 ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于 SQL 的关系模型数据库结构中去。这样&am…

隔断推拉门滑动不畅常见的原因和解决方法

隔断推拉门滑动不畅常见的原因和解决方法如下: 1. 滑轨污秽:如果滑轨上有灰尘、油垢或杂物积聚,会影响推拉门的滑动效果。解决方法是定期清洁滑轨,使用吸尘器或刷子清除污垢,并用湿布擦拭干净。 2. 滑轨损坏&#xff1…

Git---分支管理

文章目录 前言一、理解分支二、创建分支三、切换分支四、合并分支五、删除分支六、合并冲突七、分支管理策略八、分支策略九、bug分支十、删除临时分支总结 前言 本篇博客开始介绍Git的杀手级功能之一 : 分支.分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习C的时候,另…

MySQL学习基础篇(六)---多表查询

MySQL学习基础篇(六)—多表查询 对于多表查询的理解: 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是…

浅析EasyCVR视频技术与AR实景智能管理平台在智慧厂区中的应用

一、背景分析 新型智慧厂区是运用人工智能、大数据、物联网和设备监控技术加强厂区安保和信息管理。通过先进技术,保障厂区生产运营安全,同时减少生产线上的人工干预、及时正确地采集各类生产数据,以及合理的生产计划编排与生产进度&#xff…

线性规划的对偶问题(The Dual of LP)

线性规划的对偶问题(The Dual of LP) 对偶理论是线性规划中最重要的理论之一,是深入了 解线性规划问题结构的重要理论基础。同时,由于问题提 出本身所具有的经济意义,使得它成为对线性规划问题系 统进行经济分析和敏感…

原生 js点击空白处 关闭遮罩层(关闭某个div)

如图所示 点击空白处关闭此div document.addEventListener(click, function(e) {//监听页面点击事件var screenDoc document.querySelector(.controlHead);//需要关闭的divvar control document.querySelector(.control);//设置的按钮if (screenDoc && !screenDoc.co…

基于TF-IDF+Tensorflow+pyQT+孪生神经网络的智能聊天机器人(深度学习)含全部工程源码及模型+训练数据集

目录 前言总体设计系统整体结构图系统流程图孪生神经网络结构图 运行环境Python 环境TensorFlow 环境 模块实现1. 数据预处理2. 创建模型并编译3. 模型训练及保存4. 模型应用 系统测试1. 训练准确率2. 测试效果3. 模型应用 工程源代码下载其它资料下载 前言 本项目利用TF-IDF&…

【Docker、Dockerfile】使用Dockerfile创建镜像并运行容器

创建SpringBoot项目 创建一个Springboot的Java项目,然后打包成可运行的Jar 编写Dockerfile文件 在项目文件夹下创建Dockerfile文件,内容如下 # 定义用于构建镜像的 JDK 版本参数,可以在构建过程中通过 --build-arg 选项传递给 docker bui…

如何用adb命令统计app冷启耗时

第一步:杀掉App,然后重启,过滤Displayed日志,找到App启动的第一个Activity; adb logcat | grep Displayed 第二步:再次杀掉App,使用adb shell am start命令来启动app: adb shell a…

podman容器的使用

podman 安装 如果你想在rhel系统中玩podman,必须是rhel8.2版本以上。podman版本是1.9.3。从centos8.2开始默认情况下,除了最小化安装之外,系统都会默认安装podman。 如果你使用rhel8.2以上的版本,那么就直接安装podman就可以了。…