MySQL日志binlog和redo log区别

MySQL binlog简介

MySQL中有两类日志:binlog和redo log,分别有不同的作用和解决问题。binlog是归档日志,在MySQL server层的日志,适用于所有存储引擎,redo log是innodb特有日志用于crash-safe时恢复数据。

binlog和redo log的区别

binlog是server层日志,出现比redo更早,通常用于数据备份和归档。它的日志内容也是记录的DDL和DML的逻辑SQL,即差不多是SQL原句。写入方式是顺序写入,即根据配置会一直开一个新文件写入。日志格式有3种:statment、row、mixed。都分别有优劣势,其中最常用的是row。

redo log是innodb层日志,专门用于crash时的数据页恢复,内容是记载数据页的物理修改,即编号123数据页的偏移量xxxxxx的数据的k值改为v1。写入方式是循环写,4个log文件构成一个循环,有write pos、checkpoint指针控制写入逻辑。write pos< checkpoint,checkpoint前的修改都是已经将数据页落盘的,之后的是未落盘,write pos追上checkpoint时候会发生强制刷脏页。write pos之后会一直覆盖写。通常redo log是4GB,每个文件1GB大小。

redo log的文件示意图。

为什么有了binlog还要有redo log?

很多人会立即回答,这个日志用途不一样。是的,可能这样问不够清晰。如果限定在crash时的数据恢复领域,就值得思考了。

首先我们都知道WAL机制,如果flush_log_at_trx binlog=1 和 binlog_sync=1,即双1配置。binlog和redo log都是在事务提交前必须得落盘的,其中binlog记录的是所有DDL&DML语句,那么在crash后DB重启,是不是可以重放所有binlog达到数据恢复目的?

答案是不行。从以下几个方面解释:

  • binlog恢复速度比redo慢
  • binlog恢复可能导致数据不准
  • binlog无法保证幂等
  • binlog没有checkpoint

binlog内容记录的是SQL原句,所以在重放时可能会涉及很多数据的更新,自然比redo直接恢复数据页慢很多。

由于记得SQL原句,在update T set time=now() 这种函数时,恢复出来的数据自然是不准确的,违反了事务提交时的数据一致性原则。

最重要的是后面2条原因。1.binlog无法保证幂等,考虑一条SQL。如果数据库多次崩溃,多次重放binlog,那么id=123的行数据的k值就会递增。例如:k初始为0,SQL第一次执行后提交k=1,数据页也落盘了,此时DB crash后恢复重放SQL,k=2这就不对了。

update T set k=k+1 where id = 123

2.binlog没有checkpoint。因为是追加写,没有checkpoint就不知道哪一些脏页已经被落盘刷新。不知道从哪里开始恢复,只能从最开始的binlog开始重放一遍所有的DML语句,这速度和时间消耗着实太大,不适合crash恢复的场景。

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

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

相关文章

【C++】—— list 模拟实现

【C】—— list 模拟实现 1 list 基础结构2 默认构造3 迭代器3.1 整体框架3.2 成员函数3.3 begin() 与 end() 的实现3.4 operator-> 的实现3.5 const 迭代器3.5.1 const 迭代器为什么命名 const_iterator3.5.2 const 迭代器的实现3.5.3 合并两个迭代器 4 源码 1 list 基础结…

【C++前后缀分解】1653. 使字符串平衡的最少删除次数|1793

前后缀分解 C前后缀分解 LeetCode1653. 使字符串平衡的最少删除次数 给你一个字符串 s &#xff0c;它仅包含字符 ‘a’ 和 b’​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] ‘b’ 的同时…

软考中项(第三版):项目质量管理总结

前言 系统集成项目管理工程师考试&#xff08;简称软考中项&#xff09;&#xff0c;其中案例分析也是很大一部分考试内容&#xff0c;目前正在学习中&#xff0c;现总结一些可能会考到的知识点供大家参考。 1.1、项目质量管理总线索 1、质量管理的发展史 &#xff08;1&…

创建一个Java项目并在项目中新建文件,最后实现程序简单的输出

目录 前言 一、建立项目及新建Java类 二、输入简单代码实现输出 前言 1.本文所讲的是java程序设计语言&#xff0c;其内容是如何在id中新建一个项目&#xff0c;并新建一个Java文件&#xff0c;在其内输入相关代码并对其输出&#xff1b; 2.Java文件的编写以收入到我的专栏…

JDBC实现对单表数据增、删、改、查

文章目录 API介绍获取 Statement 对象Statement的API介绍使用步骤案例代码 JDBC实现对单表数据查询ResultSet的原理ResultSet获取数据的API使用JDBC查询数据库中的数据的步骤案例代码 API介绍 获取 Statement 对象 在java.sql.Connection接口中有如下方法获取到Statement对象…

IM系统完结了,那简历该怎么写?(含简历项目描述)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

开放式耳机排行榜前十名?分享四款高性价比的开放式蓝牙耳机

开放式耳机并不一定要选价格贵的才好&#xff0c;而是应该按照个人需求来选择合适的开放式耳机产品&#xff0c;适合自己的才是最好。而且开放式耳机的价格区间也很广&#xff0c;从几十元到上千元不等&#xff0c;在每个价位区间里都有属于每个价位区间的高性价比耳机。选择耳…

RusTitW:大规模语言视觉文本识别数据集(猫脸码客 第190期)

RusTitW: Russian Language Visual Text Recognition 一、引言 在信息爆炸的现代社会&#xff0c;文本作为信息传递的重要载体&#xff0c;扮演着不可或缺的角色。随着计算机视觉与模式识别技术的飞速发展&#xff0c;自动化文本识别&#xff08;OCR, Optical Character Reco…

【LabVIEW学习篇 - 25】:JKI状态机

文章目录 JKI状态机JKI状态机安装JKI状态机的基本了解状态机的运行原理示例 JKI状态机 JKI状态机的核心就是队列消息状态机用户事件处理器模式&#xff0c;JKI状态机采用指定格式的字符串来描述状态。 JKI状态机并没有采用队列而是采用指定的字符串进行存储&#xff0c;它封装…

用EA和SysML一步步建模(07)蒸馏器系统上下文图01

用EA和SysML一步步建模的操作指南&#xff08;01&#xff09; 用EA和SysML一步步建模&#xff08;02&#xff09;导入ISO-80000 用EA和SysML一步步建模&#xff08;03&#xff09;创建包图和包的关系 用EA和SysML一步步建模&#xff08;04&#xff09;创建“需求组织”包图 …

【ACM出版】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024,10月25-27)

第三届人工智能与智能信息处理国际学术会议&#xff08;AIIIP 2024&#xff09; 2024 3rd International Conference on Artificial Intelligence and Intelligent Information Processing 中国-天津 | 2024年10月25-27日 | 会议官网&#xff1a;www.aiiip.net 官方信息 会议…

flask项目初始化

1、初始环境 python3.8 2、flask文档地址&#xff1a;https://flask.palletsprojects.com/en/latest/installation/#install-flask 3、初始化项目 $ mkdir myproject $ cd myproject $ python3 -m venv .venv $ . .venv/bin/activate $ pip install Flask4、打开项目mypr…

如何关闭前端Chrome的debugger反调试

1、禁用浏览器断点 2. 把控制台独立一个窗口

Java数据结构(十一)——归并排序、计数排序

文章目录 归并排序算法介绍代码实现非递归实现复杂度和稳定性 计数排序算法介绍代码实现复杂度和稳定性 归并排序 算法介绍 归并排序是一种分而治之的排序算法。基本思想是&#xff1a; 将一个数组分成两半&#xff0c;对每半部分递归地应用归并排序先进行分解&#xff0c;然…

Linux基础---11优化系统

一.优化SSH连接速度 1&#xff09;修改配置文件 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak#备份vi /etc/ssh/sshd_config将79行和115行的yes修改为no,最后:wq保存退出&#xff08;79gg和115gg可直接跳至本行&#xff09; 79 行&#xff1a;GSSAPIAuthentication no…

fiddler抓包02_安装

① 访问官网&#xff1a;https://www.telerik.com/fiddler ② 点击“try for free”&#xff0c;选择经典版。 ③ 选择任意用途&#xff0c;输入邮箱&#xff0c;选择地区china&#xff0c;确定下载。 ④ 双击安装包进行安装。 安装后为英文界面&#xff1a;

iOS 18 新功能:控制中心大變身!控制項目自由選配

蘋果於 Apple iOS 18 中為控制中心帶來大改變&#xff0c;變得更具有擴充性&#xff0c;而且將支援第三方應用的控制按鈕&#xff0c;中心內的組件大小也可調節。如今 iOS 18 正式上線&#xff0c;我們就可以試試控制中心不同項目自由選配帶來的效果。 組件可在三尺寸之間調整 …

分页 101012

地址拆分&#xff1a; 10-10-12 假设虚拟地址&#xff1a;0x12345678 0001 0010 0011 0100 0101 0110 0111 10000001 0010 00 -> 0x48 (PDE) 11 0100 0101 -> 0x345 (PTE) 0110 0111 1000 -> 0x678 (物理页偏移)

文字loading加载

效果 1. 导入库 import sys from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QPainter, QFont, QColor, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel 代码首先导入了P…

【Linux】初识信号与信号产生

目录 一、认识信号 1 .什么是信号 2 .哪些情况会产生信号 3 . 查看信号 4 . 信号处理 二、产生信号 1 .通过终端按键产生信号 2 .调用系统函数向进程发信号 3 . 由软件条件产生信号 4 . 由硬件异常产生信号 一、认识信号 1 .什么是信号 你在网上买了很多件商品&#xff0c;再…