MySQL三大日志undolog、redolog、binlog

news2024/11/19 2:23:38

在MySQL中,很多的功能也都需要基于日志实现,比如事务回滚、数据持久化、数据恢复、数据迁移、MVCC机制。其中undolog、redolog都是InnoDB引擎中的日志,而且都是在Buffer Pool中,而binlog在Server层中,位于每条线程中。

1. undo log(回滚日志)

undo log 叫做回滚日志,它保证了事务的 ACID 特性中的原子性(Atomicity),是存储引擎层生成的日志,记录的是逻辑操作,不会去修改磁盘数据页的数据。主要用于记录数据被修改前的信息,在表记录修改之前,会先把原始数据拷贝到undo log里,如果事务回滚,则可以通过undo log中的历史数据来恢复到事务执行前的数据。

(1)不同操作记录的内容
  • insert 插入操作,会在undo log中记录本次插入的主键id,等事务回滚时,会delete此主键对应的记录;
  • delete 删除操作,会记录一条删除前的数据的insert语句,回滚时,insert原来的数据;
  • update 更新操作,会记录一条更新前旧值的update的语句,回滚时再次执行这条语句更新回原来的数据。
(2)作用
  • 回滚事务时,恢复到修改前的数据。
  • 实现 MVCC。
2. redo log(重做日志)

redo log 叫做重做日志,它保证了事务的 ACID 特性中的持久性(Durability),是存储引擎层生成的日志,记录的是物理操作。防止事务已经提交到Buffer Pool中的数据还没来的急刷到磁盘数据页服务崩溃而导致的数据丢失问题,因为事务的所有操作都记录到redo log日志文件中了,在重启mysql服务的时候,根据redo log进行重做,从而保证事务的持久性。

(1)redo log 与 undo log主要区别
  • redo log 记录了此次事务「完成后」的数据状态,记录的是更新之后的值;
  • undo log 记录了此次事务「开始前」的数据状态,记录的是更新之前的值;
(2)为什么需要写Redo Log Buffer和Redo Log FIle
  • InnoDB在磁盘中存储的基本单元是页,每页大小为16KB,可能本次修改只变更一页中几个字节或者多页中的几个字节,但是直接刷盘是需要刷新整页的数据,就很浪费资源;而写入Redo Log FIle一行记录可能就占几十Byte,只包含表空间号、数据页号、磁盘文件偏移 量、更新值。
  • 一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能很差;而写入Redo Log FIle是顺序追加在Redo Log FIle文件中,顺序IO的性能更好。
(3)刷盘策略

更新的数据写入Redo Log Buffer之后,并不会立即持久化到Redo Log FIle,需要等待操作系统调用fsync()操作,才会刷到磁盘的Redo Log FIle上。InnoDB通过innodb_flush_log_at_trx_commit 参数可以控制策略,可设置该参数的值为:0,1, 2。

  • 设置为0(延迟写):每次事务提交时不主动进行刷盘操作,数据依然留在redo log buffer中,然后由后台线程每秒写入os cache中并调用fsync()写入到磁盘的Redo Log FIle中。这种方式每个1秒写入到磁盘文件,如果在这1秒之内,MySQL服务挂了,则会丢失这1秒的数据。
    在这里插入图片描述

  • 设置为1 (实时写,实时刷, 默认值 ):每次事务提交时立即将缓存在redo log buffer中的数据写入到os cache中并调用fsync()写到磁盘的Redo Log FIle中。这种方式提交事务后立即会刷新到磁盘文件,所以不会丢失数据。
    在这里插入图片描述

  • 设置为2(实时写,延时刷):每次提交事务只将缓存在redo log buffer中的数据写入到os cache,然后由后台线程每秒调用fsync()将os cache的数据写入磁盘的Redo Log FIle中。这种方式如果仅仅只是MySQL服务挂了不会有任何数据丢失,但是如果操作系统挂了则会丢失1秒的数据。
    在这里插入图片描述
    除了上面3种策略进行刷盘以外,还有两种场景会让一个没有提交的事务的 redo log 写入到磁盘中。

  • 当redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动触发刷盘操作。由于这个事务并没有提交,所以这个刷盘动作只是写入os cache,而没有调用 fsync(),也就是只留在了操作系统的 os cache中。

  • 并行的事务提交的时候,顺带将这个事务的 redo log buffer 持久化到磁盘。

(4)日志文件组

磁盘上的redo log文件不只一个,而是以一个日志文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2…)的形式进行命名,每个的Redo日志文件大小都是一样的,默认由两个文件组成。在写入数据的时候采用循环使用的方式向redo log日志文件组里写数据,而在整个日志文件组中还有两个重要的属性,分别是write pos、checkpoint。

  • write pos是当前写入记录的位置,一边写一边后移;
  • checkpoint是当前要擦除记录的位置,也是往后推移。
    在这里插入图片描述
    上图中从write pos位置顺时针开始写,红色部分是可以写入的的区域,从checkpoint位置顺时针开始清除redo log文件中已经写入的数据,蓝色部分是已经被写入的区域。
    • 每次刷盘 redo log 记录到日志文件组中,write pos 位置就会后移更新。
    • 每次MySQL加载日志文件组恢复数据时,会清空加载过的 redo log 记录,并把checkpoint后移更新。
    • 如果write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log记录,MySQL的停下来,清空一些记录,把 checkpoint 推进一下才能继续写入新的记录。
3. bin log(重做日志)

bin log是二进制日志文件,它记录了数据库所有执行的 DDL 和 DML 等数据库更新的语句,但是不包含select或者show等没有修改任何数据的语句。它是MySQL级别的日志,也就是说所有的存储引擎都会产生bin log,而redo log或者undo log事务日志只有innoDB存储引擎才有。

(1)主要作用
  1. 数据恢复:如果MySQL数据库意外挂了,可以利用bin log进行数据恢复,因为该日志记录所有数据库所有的变更,保证数据的安全性。
  2. 主从复制:将主节点的bin log日志传递给从节点,再利用bin log日志来恢复从节点的数据,从而实现主从库数据的一致性,实现架构的高可用和高性能。
(2)bin log与redo log主要区别
  • redo log主要实现故障情况下的数据恢复,保证事务的持久性;bin log主要用于数据灾备、同步。
  • redo log是"物理日志", 记录的是具体数据页上做了什么修改;bin log是"逻辑日志", 记录内容是语句的原始逻辑。
  • redo log是InnoDB存储引擎生成的事务日志,其他存储引擎没有;bin log是MySQL Server生成的日志,所有的存储引擎都有。
  • redo log是在事务执行过程中就会写入;bin log是在事务提交的时候写入。
(3)刷盘策略

bin log和 redo log类似,都有3种刷盘策略, bin log的write和fsync时机是由参数 sync_binlog 控制,默认是 0 。

  • 为0的时候:表示每次提交事务都只写入到os cache,再由系统自行判断什么时候执行fsync。虽然性能得到提升,但是系统挂了,os cache里面的 binglog 会丢失。
  • 为1的时候:表示每次提交事务都会写入os cache并由系统立即调用fsync()写入磁盘文件中,这种方式数据不会丢失,更加安全。
  • 为N(N>1)的时候:表示每次提交事务都只写入os cache,但累积N个事务后系统才调用fsync()写入磁盘文件中。
(4)查看bin log开启情况

可以通过命令show variables like '%log_bin%';查看bin log开启状态以及最终输出的位置。
在这里插入图片描述

(5)查看日志文件列表和大小

通过SHOW BINARY LOGS;查看当前的二进制日志文件列表及大小。
在这里插入图片描述

(6)查看bin log日志中的内容

可以用show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];命令工具查看bin log日志中的内容。
IN ‘log_name’:指定要查询的binlog文件名(不指定就是第一个binlog文件);
FROM pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算);
LIMIT [offset] :偏移量(不指定就是0);
row_count :查询总条数(不指定就是所有行);
在这里插入图片描述

(7)设置bin log

修改MySQL的 my.cnf(linux) 或my.ini(windows)文件可以设置二进制日志的相关参数。

# 日志保存的位置
log-bin=SC-bin
# 日志保存的时间,单位是秒
binlog_expire_logs_seconds=600
# 单个bin log日志的容量
max_binlog_size=100M
(8)查看bin log 格式

bin log输出的格式类型有3种,默认是ROW类型。通过show variables like 'binlog_format';查看bin log 日志格式。
在这里插入图片描述

  1. Statement格式:记录的是逻辑SQL语句,每一条会修改数据的sql都会记录在bin log中。
    • 优点:日志文件小,不需要记录每一行的变化,节约IO,提高性能。
    • 缺点:准确性差,对一些系统函数不能准确复制,如now(),可能导致主从同步、恢复数据不一致。
  2. ROW格式:记录表的行更改情况。
    • 优点:准确性强,能准确复制数据的变更。
    • 缺点:日志文件大,较大的网络IO和磁盘IO。
  3. Mixed格式: 混合模式,即Statment、Row的结合版。
    • 优点:准确性强,文件大小适中。
    • 缺点:有可能发生主从不一致的问题。

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

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

相关文章

如何在小程序首页设置标题栏文字

小程序的首页标题栏是用户进入小程序时首先看到的部分,因此设置一个适合文字对于树立品牌非常有作用。以下是一些简单的步骤,教你如何在小程序的首页设置标题栏文字(如下图,白色的“商城”文字)。 1. 在小程序管理员后…

电大搜题——学习的好机会

添加图片注释,不超过 140 字(可选) 近年来,随着广播电视大学教育的普及,重庆开放大学以其卓越的教学品质和领先的教育理念,在继续教育领域崭露头角。作为这一教育品牌下的杰出成果,电大搜题微信…

旧苹果手机数据如何导入新手机里面?

旧iphone数据怎么导入新iphone?一般需要先备份旧iphone,然后再将备份恢复到新iphone。如果满足一定条件,也可以通过设备传输的方式。旧iphone数据导入新iphone要多久?这取决于导入的数据量以及使用的工具。本文会给大家详细讲解一…

【JavaEE初阶】 synchronized关键字详解

文章目录 🌴synchronized 的特性🚩互斥🚩可重入 🍀synchronized 的使用🚩直接修饰普通方法🚩修饰静态方法🚩 修饰代码块🧭synchronized 的使用总结: 🎍Java 标…

TCP/IP(十一)TCP的连接管理(八)socket网络编程

一 socket网络编程 socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close 说明: 本文需要C语言、syscall系统调用、OS 操作系统支持,如果不了解可以暂时跳过备注: 知道对应库函数的更底层机制思考: socket函数与FIN、ACK等…

Malformed \uxxxx encoding.问题解决方案

问题背景 Maven项目构建时报错如下, [ERROR] Malformed \uxxxx encoding. [ERROR] java.lang.IllegalArgumentException: Malformed \uxxxx encoding. [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re…

测试岗最好用的——十大软件测试工具

前言 目前由于软件测试工作在软件的生产过程中越来越重要,很多软件测试工具应运而生,这里介绍一下目前最流行的一些软件测试工具,一个十个,介绍如下: 一、企业级自动化测试工具WinRunner 这款软件是Mercury Interact…

[NPUCTF2020]ezinclude 文件包含两大 getshell方式

PHP LFI 利用临时文件 Getshell 姿势 | 码农家园 说一下我的思路吧 robots没有 扫描发现存在 dir.php 然后404.html 报错 apache 2.18 ubuntu 这个又正好存在漏洞 所以前面全去看这个了 结果根本不是这样做。。。 正确的思路是这样 发现变量 认为是 name和 pass传递参数…

Python 机器学习入门之牛顿法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 梯度下降法 系列文章目录前言一、牛顿法1.牛顿法简介2.基本原理 总结 前言 上一篇文章里面说到了梯度下降法,它是使用泰勒近似定…

第18篇ESP32platformio-arduino框架-ili9488-3.5lcd显示时间天气

第18篇ESP32platformio-arduino框架-ili9488-lcd显示时间天气 第18篇esp32ili9488lcd显示时间天气 连接方法: 修改WIFI: 关键代码 void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(ssid,password);Serial.print("\r\nConnect…

codesys【软PLC】

软plc一般安装在工控机里。或者笔记本等小型电脑内。 电视盒子需要:刷个armbain 软件下载地址: CODESYS商城-商品列表 A:是实时系统 B:非实时 C:这个不能单独运行,需要在B的基础上。开启了多核线程…

国际教材概念基础

各种区别 缩写 A-LEVEL(大学预科):General Certificate of Education Advanced Level AP:Advanced Placement(美国地区:美高AP) GCSE:General Certificate of Secondary Educati…

下载调试器 JTAG和SWD

下载调试器 JTAG和SWD 作为嵌入式工程师,下载调试器 JTAG和SWD是经常使用的,但你真正了解其SWD 和 JTAG接口的含义和区别吗? 一、什么是下载调试器? 下载调试器是将PC(例如通过USB协议)发送的命令转换为…

数组的reduce和reduceRight方法

1.reduce方法可用接收两个参数: 第一个参数:为一个回调函数,此回调函数又可以有四个参数 第1个参数:为上一次回调函数return的结果,首次默认为第二个参数值,如果没有第二个参数值,则默认当前数…

[Mono Depth/3DOD]单目3D检测基础

1.数据增强 图像放缩和裁剪后,相机内参要做相应变化 import random def random_scale(image, calib, scale_range(0.8, 1.2)):scale random.uniform(*scale_range)width, height image.sizeimage image.resize((int(width * scale), int(height * scale)))cali…

4.03 用户中心-订单管理功能开发

用户中心-订单管理功能开发: (1)包含用户订单的查询根据订单并进行分页 (2)订单的确定和交易关闭订单删除 详细内容,查询地址:http://www.gxcode.top/code 页面下载地址:

【C++】神奇字符串(力扣481)

神奇字符串的规律: 神奇字符串 s 仅由 ‘1’ 和 ‘2’ 组成,并需要遵守下面的规则: 神奇字符串 s 的神奇之处在于,串联字符串中 1 和 2 的连续出现次数可以生成该字符串。 s 的前几个元素是 s “1221121221221121122……” 。如果…

项目管理过程组

项目管理有2条主线,一条是技术,一条是管理。项目过程由项目团队实施。一般术语以下两大类之一:一类是项目管理过程。另一类是面向产品的过程。在大多数情况下,大多数项目都有共同的项目管理过程。它们通过有目的的实施而互相联系起…

界面组件DevExtreme v23.2新功能预览 - 增强Material主题功能

界面组件DevExtreme v23.2即将在几个月之后交付,本文将带大家预览一波新功能。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuer…

IOday3作业

#include <head.h> int get_filePerrmison(mode_t mode)//获取文件权限 {char per[] "rwx";for(int i0;i<9;i){if((mode&(0400>>i))0){putchar(-);continue;}putchar(per[i%3]);}} int get_fileType(mode_t m) //获取文件类型 {switch(m&S_IF…