MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?

news2024/11/23 3:37:46

MySQL是一个功能强大的关系型数据库管理系统,它的高可靠性、高性能和易用性使得它成为众多企业和开发者的首选。在MySQL内部,为了保证数据的完整性、恢复能力和并发性能,设计了一套复杂的日志系统。其中,redo log、bin log和undo log是MySQL中最为重要的三种日志,它们各自扮演着不同的角色,共同维护着数据库的稳定运行。

MySQL的日志系统概述

MySQL的日志系统是其稳定性和性能的重要保障。MySQL的日志主要包括以下几种:

  1. 错误日志(Error Log):记录启动、运行或停止mysqld时出现的问题。

  2. 查询日志(General Query Log):记录已连接到MySQL服务器的客户端所执行的SQL语句。

  3. 慢查询日志(Slow Query Log):记录执行时间超过指定阈值的SQL语句。

  4. 二进制日志(Binary Log,简称bin log):记录所有更改数据或可能更改数据的SQL语句,并以二进制格式保存在磁盘上。

  5. 重做日志(Redo Log):InnoDB存储引擎特有的日志,用于保证事务的ACID特性。

  6. 回滚日志(Undo Log):也是InnoDB存储引擎特有的日志,用于事务的回滚操作。

binlog详解 

binlog是MySQL服务器层的日志,用于记录所有更改数据或可能更改数据的SQL语句。它主要用于数据复制和恢复操作。【一致性:C】

1. 记录格式:

  • binlog支持多种记录格式,如STATEMENT、ROW和MIXED。不同的格式有不同的优缺点,需要根据实际场景选择合适的格式。

2. 写入机制:

  • 当执行一个可能修改数据的SQL语句时,MySQL服务器会将其记录到binlog中。

  • binlog的写入是同步的,即写入操作完成后才会返回给客户端。

3. 刷盘时机:

  • 在事务提交时,为了保证数据的持久性,会将binlog写入磁盘。

  • 与redo log不同,binlog的写入是同步的,即写入磁盘后才能返回给客户端。

4. 日志记录文件组和流程:

  • binlog通常由多个文件组成,当一个文件写满后,会自动切换到下一个文件继续写入。

  • 记录流程包括解析SQL语句、生成事件对象、将事件对象写入binlog缓冲区、最后将事件对象写入磁盘文件。

5. binlog的作用:

  • 复制:MySQL的主从复制就是依赖于binlog来实现的。主服务器上的binlog会被从服务器读取并执行,从而实现数据的同步。

  • 数据恢复:如果MySQL服务器发生了数据丢失或损坏,可以通过binlog中的事件来恢复数据到某个特定的时间点。

  • 审计:在某些场景下,binlog也可以用于审计目的,因为它记录了所有的修改操作。

6. binlog的三种格式:

  • ROW:基于行的复制(row-based replication, RBR),每一条会修改数据的SQL语句都会记录为每一行的变化。优点是不需要记录SQL语句上下文信息,不会产生某些特定情况下的主从数据不一致问题。缺点是有可能会产生大量的日志,尤其是修改大量数据的时候。

  • STATEMENT:基于语句的复制(statement-based replication, SBR),每一条会修改数据的SQL语句都会记录在binlog中。优点是不需要记录每一行的变化,减少了binlog日志量,节约了IO,节约了存储空间。缺点是由于记录的只是执行语句,为了保证这些语句在slave上正确运行,还必须记录每条语句在执行时的一些相关信息,例如当前的时间戳、执行的线程ID等。另外,如果SQL语句中包含了一些函数,可能会出现执行结果不一致的情况。

  • MIXED:混合复制(mixed-based replication, MBR),是以上两种格式的混合使用。MySQL会根据执行的SQL语句的类型和系统变量的设置自动选择使用STATEMENT还是ROW格式进行记录。

7. binlog的配置:

要启用binlog,你需要在MySQL的配置文件(如my.cnf或my.ini)中设置log_bin选项,并指定binlog的存储路径和文件名前缀。例如:


[mysqld]  
log_bin = /var/log/mysql/mysql-bin  
server_id = 1

此外,还可以通过设置binlog_format来指定binlog的格式。 

8. binlog数据恢复

使用MySQL的binlog进行数据恢复是一种可靠的方法,特别是当数据丢失或损坏时。以下是使用binlog进行数据恢复的基本步骤:

1). 确定数据丢失的时间点

首先,你需要确定数据丢失或损坏的大致时间点。这通常是通过检查备份、系统日志或询问相关人员来完成的。

2). 找到对应的binlog文件

根据确定的时间点,找到包含该时间点之前所有事件的binlog文件。binlog文件通常位于MySQL服务器配置的目录中,文件名包含了一个时间戳,可以帮助你识别文件。

3). 使用mysqlbinlog工具查看binlog内容

使用mysqlbinlog工具可以查看binlog文件的内容。这个工具可以将binlog文件转换为可读的格式,方便你查看其中的事件。


-- bash

 mysqlbinlog /path/to/binlog-file > output.txt

这将把binlog文件的内容输出到output.txt文件中。你可以使用文本编辑器打开这个文件,查找你感兴趣的事件。

4). 确定恢复的位置

在output.txt文件中,找到数据丢失之前的最后一个完整事务的位置。这个位置可以通过查看文件中的GTID、COMMIT等标识来确定。

5). 使用mysqlbinlog提取恢复所需的事件

使用mysqlbinlog工具的--start-position和--stop-position选项,提取从数据丢失之前的最后一个完整事务到数据丢失之前的时间点之间的所有事件。


-- bash

 mysqlbinlog --start-position=YOUR_START_POSITION --stop-position=YOUR_STOP_POSITION /path/to/binlog-file > recovery-events.sql

这将生成一个包含恢复所需事件的SQL文件recovery-events.sql。

6). 应用恢复事件

在确保备份了当前数据库状态之后,登录到MySQL服务器,并使用mysql客户端执行recovery-events.sql文件中的SQL语句。


-- bash

 mysql -u your_username -p your_database < recovery-events.sql 

这将把提取的事件应用到数据库中,恢复数据到丢失之前的状态。

注意事项:

  • 备份:在进行任何恢复操作之前,确保备份了当前的数据库状态,以防万一操作出现问题。

  • 测试:在正式恢复之前,最好在一个测试环境中进行恢复操作,以确保提取的事件是正确的,并且恢复过程不会引入新的问题。

  • binlog的完整性:确保在数据丢失之前没有删除或修改过binlog文件,否则恢复可能不完整或失败。

  • 权限:执行恢复操作时,确保使用的MySQL用户具有足够的权限来执行所需的SQL语句。

通过仔细操作和使用binlog,可以有效地恢复丢失的数据,并保持数据库的完整性和一致性。

undo log详解 

数据库事务四大特性中有一个是 原子性 ,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况

我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚,在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的,所有事务进行的修改都会先先记录到这个回滚日志中,然后再执行相关的操作。

如果执行过程中遇到异常的话,我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。

另外,MVCC 的实现依赖于:隐藏字段、Read View、undo log。在内部实现中,InnoDB 通过数据行的 DB_TRX_ID 和 Read View 来判断数据的可见性,如不可见,则通过数据行的 DB_ROLL_PTR 找到 undo log 中的历史版本。

每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改。

redo log详解

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

MySQL 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。

后续的查询都是先从 Buffer Pool 中找,没有命中再去硬盘加载,减少硬盘 IO 开销,提升性能。

更新表数据的时候,也是如此,发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。

然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里。

 理想情况,事务一提交就会进行刷盘操作,但实际上,刷盘的时机是根据策略来进行的。

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

刷盘时机 

InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:

  • 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作

  • 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)

  • 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache

innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsync 对 redo log 进行刷盘

另外,InnoDB 存储引擎有一个后台线程,每隔1 秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。

也就是说,一个没有提交事务的 redo log 记录,也可能会刷盘。 

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

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

相关文章

数据开发人员如何真正理解业务、并构建业务模型?

问题背景 最近有同学在问&#xff0c;新到一家公司&#xff0c;如何去深入理解业务&#xff1f;并高于业务视角呢&#xff1f; 针对这个问题 &#xff0c;我们将问题进行拆分以下几点进行回答&#xff0c;首先懂业务的标准是什么&#xff1f; 根据笔者的经验将懂业务标准进行如…

百度出品_文心快码Comate提升程序猿效率

1.文心快码 文心快码包含指令、插件 和 知识三种功能&#xff0c; 1&#xff09;指令包含Base64编码、Base64解码、JSON转TS类型、JSON转YAML、JWT解码喂JSON。 2&#xff09;插件包含 3&#xff09;指令包含如下功能&#xff1a; 官网链接

2024最全前端面试系列(计算机网络)(非科班出身最薄弱的环节)

2020最全前端面试系列&#xff08;CSS&#xff09; 2020最全前端面试系列&#xff08;VUE&#xff09; 2020最全前端面试系列&#xff08;浏览器原理&#xff09; 2020最全前端面试系列&#xff08;数据结构&#xff09; 常见状态码 | | 类别 | 原因短语 | | — | — | —…

Laravel 谨慎使用Storage::append()

在 driver 为 local 时&#xff0c;Storage::append()在高并发下&#xff0c;会存在丢失数据问题&#xff0c;文件被覆写&#xff0c;而非尾部添加&#xff0c;如果明确是本地文件操作&#xff0c;像日志写入&#xff0c;建议使用 Illuminate\Filesystem\Filesystem或者php原生…

window下git bash设置启动后默认路径进入自己的工程

方法一&#xff1a;更改快捷方式 方法二&#xff1a;修改~/.bashrc

香港即将“放松”加密货币监管!加密牌照制度备受批评!全球主力军无法进入香港市场?动摇了香港Web3的信心!

2024年7月3日&#xff0c;香港金融服务及库务局局长许正宇在立法会会议上表示&#xff0c;香港金融管理局(HKMA)和证券及期货事务监察委员会(SFC)将根据市场发展情况&#xff0c;适时检讨虚拟资产相关活动的监管要求。 这一表态引发了人们对香港加密货币监管框架可能进行调整的…

Android Studio 大作业--学生信息管理系统

欢迎光临&#xff1a; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志。——苏轼 ---------------&#x1f34e;------------&#x1f349;-------------- &#x1f43c;学编程的bird的博客&#xff0c;邀您一起学习&#x1f98c; ----------------&am…

面试篇-Redis-3+分布式锁+集群部署

文章目录 前言一、你们项目中使用Redis 作为分布式锁吗1.1 将余券存入到Redis 中&#xff0c;当有人抢券进行-1操作并存回&#xff1a;1.2 分布式锁的使用1.3 Redis 分布式锁是怎么实现的&#xff1a;1.4 Redisson 分布式锁是可重入的吗&#xff1a;1.5 Redis 出现脑裂时如何保…

Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

防水头灯在户外探险的应用_鼎跃安全

随着我国民众生活品质的显著提升&#xff0c;人们对户外探险的热爱与参与度也日益高涨。在这一充满挑战与未知的旅途中&#xff0c;拥有一件可靠的照明设备成为了确保安全与探索乐趣的关键。面对户外多变的自然环境&#xff0c;包括突如其来的降雨、潮湿的森林小径等恶劣条件&a…

c++ primer plus 第15章友,异常和其他:友元类

c primer plus 第15章友&#xff0c;异常和其他&#xff1a;友元类 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;友元类 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的…

阳光倒灌试验太阳辐射系统日光模拟器

太阳光模拟器概述 太阳光模拟器是一种能在实验室环境下模拟太阳光照射特性的设备&#xff0c;广泛应用于材料科学、能源研究、环境科学等领域。通过模拟太阳光的光谱分布和辐射强度&#xff0c;太阳光模拟器可以为科研和工业提供稳定且可重复的光照条件&#xff0c;进而对材料…

如何隐藏和保护Excel表格中的敏感数据?

日常办公过程中&#xff0c;我们难免会遇到一些涉及个人隐私或商业机密等数据&#xff0c;那么该如何保护这些数据&#xff1f;现在&#xff0c;我将告诉你如何保护这些数据。 一、障眼法 我们选中要保护的数据&#xff0c;然后点击鼠标右键&#xff0c;选择设置单元格格式。选…

【WEB前端】---HTML---结构---笔记

目录 1.标签---单标签和双标签 1.1单标签 1.2双标签 2.基本结构标签 2.1HTML标签 2.2文档头部标签 2.3文档标题标签 2.4文档的主题标签 3.常用的标题标签 (n∈[1,6]) 4.段落标签 5.换行标签 6.文本格式化标签 6.1粗体 6.2倾斜 6.3删除线 6.4下划线 7.div和spa…

9.x86游戏实战-汇编指令mov

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Linux上快速定位Java代码问题行

生产环境中&#xff0c;经常会遇到CPU持续飙高或内存、IO飙高&#xff0c;如何快速定位问题点是很多新手头疼的问题&#xff0c;只能通过经验和代码推理&#xff0c;其实这里针对Java程序可以通过top和jstack命令&#xff0c;快速定位到问题代码。 Top命令的输出 具体定位之前…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

DC/AC电源模块:效率与可靠性兼备的能源转换解决方案

BOSHIDA DC/AC电源模块&#xff1a;效率与可靠性兼备的能源转换解决方案 随着科技的迅速发展和人工智能技术的逐渐成熟&#xff0c;各种电子设备的需求也日益增加。然而&#xff0c;这些设备往往需要不同的电压和电流来正常工作&#xff0c;而供电方式却可能不尽相同。这时&am…

miniprogram-to-uniapp-微信小程序转换成uniapp项目

文章目录 参考:miniprogram-to-uniapp使用指南第一步第二步第三步第四步【miniprogram-to-uniapp】转换微信小程序”项目为uni-app项目(新版本工具已经支持各种小程序转换) 参考: 小程序技能树 uni-app基础知识总结 miniprogram-to-uniapp使用指南 第一步 win + R 输入…