MySQL有哪些日志?
MySQL主要有三种日志:undo log、redo log、binlog。前两种是InnoDB特有的,binlog是MySQL的Server层中的。
Buffer Pool
buffer pool是MySQL的缓冲池,里面存储了数据页、索引页、undo页等(与数据库不一致的即为脏页)。对数据库做的操作都会先在buffer pool中执行,后配合redo log持久化到磁盘。
undo log
事务回滚
undo log是回滚日志,用于保证事务原子性。在事务执行过程中会记录undo log日志(这里是先记录在buffer pool的undo页中,生成undo log,需要记录对应的redo log),若事务需要回滚,则根据undo log执行与原来相反的操作。
MVCC
我们知道数据库中的一条记录中包含了两个隐藏列:trx_id(事务ID)和roll_pointer(版本指针),undo log记录中也是如此,通过版本指针把记录的旧值连成链表(数据页中的数据就是最新版本),通过版本指针查找记录的旧版本,使用trx_id和Read View判断事务可见性。Read View是什么?
Read View : 快照,在可重复读级别下,每一个事务开始都会生成一个Read View,保证查看的数据一致。
重要字段:
- creator_trx_id:创建这个快照的事务ID
- m_ids:存储的是当前时刻活跃的事务ID(活跃事务指的是已已启动但未提交的事务)
- min_trx_id:活跃事务ID中的最小值
- max_trx_id:下一个事务分配的trx_id
如何判断事务可见性?
通过比较记录中的trx_id:
- trx_id < min_trx_id:代表修改记录的事务早就提交,可见。
- trx_id >= max_trx_id:代表修改记录的事务在当前时刻还没启动,不可见。
- 分两种情况:
- trx_id在m_ids中:事务未提交,不可见。
- trx_id不在m_ids中:事务已提交,不可见。
通过比较trx_id来控制并发事务,这就是MVCC(多版本并发控制)。
redo log
redo log是重做日志,使得MySQL具有crash-safe(崩溃恢复)能力,保证了事务的持久性。
首先,redo log是一个循环文件组,写入为循环写。通过以下两个参数设置文件数量和文件大小:
innodb_log_files_in_group
innodb_log_file_size
事务执行时的操作会被写入redo log buffer中,记录的字段主要有:操作类型、修改的数据页号、修改数据的页内偏移量、修改的字段值。
write pos指向当前记录的位置,checkpoint指向当前要擦除的位置。

当write pos追上checkpoint时,说明redo log文件满了,这时不能再进行新的更新操作了,更新操作的SQL将被堵塞。此时会停下来把buffer pool中的脏页刷盘,让checkpoint后推,才可以进行操作。
刷盘
- 写入方式:redo log文件是顺序写(性能好),而数据页是随机写。
- 刷盘时机:
- 数据库正常关闭
- InnoDB会有一个后台线程每隔一秒将redo log buffer持久化到磁盘
- 事务提交时(控制参数:
innodb_flush_log_at_trx_commit)
innodb_flush_log_at_trx_commit参数
- 参数为0:留在redo log buffer中,不刷新到磁盘(可能会丢失上1秒的所有数据)。
- 参数为1:直接刷新到磁盘(fsync)。
- 参数为2:写入redo log文件(操作系统中的Page Cache)(操作系统不挂就不会丢失)。
参数0和2是通过上文说到的后台线程来刷盘的。
- 0:redo log buffer (write) -> Page Cache (fsync) -> 磁盘
- 2:Page Cache (fsync) -> 磁盘
binlog
binlog是归档日志。主要用于数据备份、主从复制。
与redo log的区别
- 适用范围不同:开篇就说了,redo log是InnoDB存储引擎特有的,binlog是都能使用的
- 日志格式:binlog有三种格式:ROW、STATEMENT(默认)、MIXED。
STATEMENT:记录操作的SQL(相当于记录了逻辑操作,所以针对这种格式binlog可以被称为逻辑日志),主从复制中根据SQL语句重现,但是当记录的SQL中使用了动态函数(uuid, now...),这样就会导致主从数据不一致。ROW:记录行数据被修改成什么样了(这时就不能称为是逻辑日志了),产生记录多,导致binlog文件过大。MIXED:根据情况自动选择日志格式(STATEMENT, ROW)。redo log是物理日志,记录的是在某个数据页做了什么修改。比如对 XXX 表空间中的 XXX数据页 ZZZ 偏移量的地方做了 AAA 修改。
- 写入方式不同:binlog是追加写,写满一个文件就创建一个新文件接着写。
- 用途不同。
主从复制
- 主库写入
binlog,提交事务,更新数据。 - 从库会创建一个专门的
I/O线程连接主库的log dump线程,来接收主库的binlog日志,然后再把binlog信息写入一个relay log(中继日志),返回给主库“复制成功”的响应。 - 从库会创建一个用于回放
binlog的线程,去读relay log,然后回放binlog更新存储引擎中的数据,最终实现主从的数据一致性。
什么时候刷盘
首先要知道的是一个事务的binlog不能被拆开(因为要保证原子性)。
在事务执行过程中,会先把binlog存储到binlog cache,binlog cache(通过binlog_cache_size控制单个线程中binlog cache的大小),满了需要暂存到磁盘。
在事务提交时,会把binlog cache的日志write到Page Cache(binglog文件) ,并清空binlog cache。通过sync_binlog参数控制fsync到磁盘的时机。
sync_binlog参数:
- 0:不会
fsync,后续由操作系统决定何时存储到磁盘 - 1:立刻
fsync - N:等存储了 N 个事务的
binlog再调用fsync
两阶段提交
目的:防止在提交事务时, redo log和binlog有一个写入失败( 数据库宕机等原因 ),导致主从数据不一致。
主要方式就是先写redo log,后写binlog。
阶段1:准备阶段(Prepare):写入redo log,将事务状态设为prepare。
阶段2:提交阶段(Commit):写入binlog并持久化到磁盘,成功后,将redo log状态改为 commit。
造成问题:
- 磁盘 I/O 次数多:一次事务提交至少需要两次刷盘
- 锁竞争激烈:为了保证多事务不发生顺序上的混乱
MySQL使用组提交的方式进行了优化,但是我在这里就不多说了。
相关文章:
MySQL有哪些日志?
MySQL主要有三种日志:undo log、redo log、binlog。前两种是InnoDB特有的,binlog是MySQL的Server层中的。 Buffer Pool buffer pool是MySQL的缓冲池,里面存储了数据页、索引页、undo页等(与数据库不一致的即为脏页)。…...
Axios:现代JavaScript HTTP客户端
在当今的Web开发中,与后端服务进行数据交换是必不可少的。Axios是一个基于Promise的HTTP客户端,用于浏览器和node.js,它提供了一个简单的API来执行HTTP请求。本文将介绍Axios的基本概念、优势、安装方法、基本用法以及如何使用Axios下载文件。…...
python学opencv|读取视频(一)灰度视频制作和保存
【1】引言 上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下: python学opencv|读取图像-CSDN博客 这次课我们继续,来学习用opencv读取视频。 【2】学习资源 首先是官网…...
【Rust WebAssembly 入门实操遇到的问题】
Rust WebAssembly 入门实操遇到的问题 什么是WebAssembly跟着教程走wasm-pack build error总结 什么是WebAssembly WebAssembly(简称Wasm)是一种基于堆栈的虚拟机的二进制指令 格式。Wasm 被设计为编程语言的可移植编译目标,支持在 Web 上部…...
掌握CMake中的变量:设置、使用及实际应用示例详解
掌握CMake中的变量:设置、使用及实际应用示例详解 在CMake中,变量的设置和使用是管理构建配置的核心部分,它使得项目配置更加灵活和动态。变量在CMake中用于保存各种数据,如路径、选项值或文件列表,可以在整个CMake配…...
React基础知识三 router路由全指南
现在最新版本是Router6和Router5有比较大的变化,Router5和Router4变化不大,本文以Router6的写法为主,也会对比和Router5的不同。比较全面。 安装路由 npm i react-router-dom基本使用 有两种Router,BrowserRouter和HashRouter&…...
[VUE]框架网页开发02-如何打包Vue.js框架网页并在服务器中通过Tomcat启动
在现代Web开发中,Vue.js已经成为前端开发的热门选择之一。然而,将Vue.js项目打包并部署到生产环境可能会让一些开发者感到困惑。本文将详细介绍如何将Vue.js项目打包,并通过Tomcat服务器启动运行。 1. 准备工作 确保你的项目能够正常运行,项…...
k8s Quality of Service
文章目录 QoS 分类规则QoS 类别影响创建 QoS 分类的案例1. Guaranteed QoS 示例示例 YAML 文件: 2. Burstable QoS 示例示例 YAML 文件: 3. BestEffort QoS 示例示例 YAML 文件: 4. 混合 QoS 示例(多个容器)示例 YAML …...
顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)
顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab) 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…...
什么语言适合做 Serverless 开发?
随着云计算的普及,**无服务器架构(Serverless Architecture)**成为一种流行的开发模式,它使得开发者无需管理服务器基础设施,专注于编写应用逻辑。无服务器架构通常按需提供计算资源,能够灵活地扩展&#x…...
使用OpenCV和卡尔曼滤波器进行实时活体检测
引言 在现代计算机视觉应用中,实时检测和跟踪物体是一项重要的任务。本文将详细介绍如何使用OpenCV库和卡尔曼滤波器来实现一个实时的活体检测系统。该系统能够通过摄像头捕捉视频流,并使用YOLOv3模型来检测目标对象(例如人)&…...
【25春招前端八股文】——JS数据类型检测方式
检测数据类型 # typeof 总结:数组、对象、null都会被判断为object,其他判断都正确的类型。 可以检测基本数据类型null会检测为Object,因为null也是一个空的引用对象复杂数据类型只能检测function和Object 情况说明: 数组&#x…...
Kafka的学习路径规划
目录标题 1. 记(记忆力)Kafka核心概念Kafka关键配置 2. 懂(理解力)Kafka工作原理Kafka核心功能Kafka架构设计 3. 网(知识网络)技术栈整合用例和场景 4. 拓(全面拓展)学习材料多样化内…...
linux模拟试题
Linux 基础阶段考试笔试模拟试卷 审核人:王旺旺 一.填空题(每题 1 分,共 30 分) 1.验证 httpd 服务是否启动的命令是_______ 答:systemctl status httpd 或 netstat -anptl 或 ss -anpt 2.将目录 xxhf 下所有文件的所属组改为 user1 的命令是_______ 答:chown -R ,user1 …...
Qt-界面优化QSS
QSS介绍 先说下CSS: 在⽹⻚前端开发领域中, CSS 是⼀个⾄关重要的部分. 描述了⼀个⽹⻚的 "样式". 从⽽起到对⽹⻚美化的作⽤。 Qt 仿照 CSS 的模式, 引⼊了 QSS, 来对 Qt 中的控件做出样式上的设定 。 CSS的功能很强大,QSS要逊色一些&#…...
QT实战-qt各种菜单样式实现
本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式, 先上图如下: 1.普通菜单样式 代码: m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…...
深度学习基础03_BP算法(下)过拟合和欠拟合
目录 一、BP算法(下) 0、反向传播代码回顾 写法一: 写法二(更常用): 1、BP中的梯度下降 1.数学描述 2.传统下降方式 3.优化梯度下降方式 指数加权平均 Momentum AdaGrad RMSProp Adam(常用) 总结 二、过拟合和欠拟合 1、概念 1.过拟合 …...
web vue 滑动选择 n宫格选中 九宫格选中
页面动态布局经常性要交给客户来操作,他们按时他们的习惯在同一个屏幕内显示若干个子视图,尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验: 设计为最多支持5行6列页面展示后,右侧的布局则动…...
Spring Boot整合EasyExcel
Spring Boot整合EasyExcel主要涉及到以下几个步骤: 1.添加EasyExcel依赖到Spring Boot项目的pom.xml文件中。 2.创建数据模型类,用于映射Excel文件中的数据。 3.编写读取和写入Excel的服务。 以下是一个简单的例子: 1.添加EasyExcel依赖 …...
微软表示不会使用你的 Word、Excel 数据进行 AI 训练
微软否认使用 Microsoft 365 应用程序(包括 Word、Excel 和 PowerPoint)收集数据来训练公司人工智能 (AI) 模型的说法。 此前,Tumblr 的一篇博文声称,雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据,用…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
