MySQL-05-MySQL的日志系统

news2025/1/9 1:07:43

1-redo log(重做日志)

       在MySQL里也有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。MySQL里经常说到的WAL技术,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

     write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。write pos和checkpoint之间的是空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示空间用完了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

2-binlog(归档日志)

       MySQL整体来看,其实就有两块:一块是Server层,它主要做的是MySQL功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。上面说的redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,称为binlog(归档日志)。 最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe的能力,binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力。
       这两种日志有以下三点不同。
[1]redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。 [2]redo log是物理日志,记录的是"在某个数据页上做了什么修改";binlog是逻辑日志,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1"。
[3]redo log是循环写的,空间固定会用完;binlog是可以追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

3-mysql的执行过程日志体现

      比如sql语句:update t1 set c=c+1 where id=2;update语句的执行流程图,图中浅红框表示是在InnoDB内部执行的,黄色框表示是在执行器中执行的。

      将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。 prepare阶段,写binlog ,commit ;当在写binlog之前崩溃时,重启恢复后发现没有commit,回滚。备份恢复,没有binlog ,数据 一致 。当在commit 之前崩溃,重启恢复:虽没有commit,但满足prepare和binlog完整,所以重启后会自动commit。备份:有binlog,数据一致 。

4-两阶段提交

       为什么必须有"两阶段提交"呢?这是为了让两份日志之间的逻辑一致。 我们来说说,为什么日志需要"两阶段提交"。这里不妨用反证法来进行解释。由于redo log和binlog是两个独立的逻辑,如果不用两阶段提交,要么就是先写完redo log再写binlog,或者采用反过来的顺序。我们看看这两种方式会有什么问题。
       仍然用前面的update语句来做例子。假设当前id=2的行,字段c的值是0,再假设执行update语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了crash,会出现什么情况呢? 【1】先写redo log后写binlog。假设在redo log写完,binlog还没有写完的时候,MySQL进程异常重启。由于我们前面说过的,redo log写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行c的值是1。 但是由于binlog没写完就crash了,这时候binlog里面就没有记录这个语句。因此,之后备份日志的时候,存起来的binlog里面就没有这条语句。 然后你会发现,如果需要用这个binlog来恢复临时库的话,由于这个语句的binlog丢失,这个临时库就会少了这一次更新,恢复出来的这一行c的值就是0,与原库的值不同。
【2】先写binlog后写redo log。如果在binlog写完之后crash,由于redo log还没写,崩溃恢复以后这个事务无效,所以这一行c的值是0。但是binlog里面已经记录了"把c从0改成1"这个日志。所以,在之后用binlog来恢复的时候就多了一个事务出来,恢复出来的这一行c的值就是1,与原库的值不同。 redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失。 sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

5-flush

       InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作redo log(重做日志),在更新内存写完redo log后,就返回给客户端,本次更新成功。为了保证数据的一致性和准确性,mysql需要找个时间更新一下硬盘数据,这对应的就是把内存里的数据写入磁盘的过程,术语就是flush当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为"脏页"。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为"干净页"。 什么情况会引发数据库的flush过程呢?
[1]InnoDB的redo log写满了。这时候系统会停止所有更新操作,把checkpoint往前推进,redo log留出空间可以继续写【参考章节1的图】。
[2]系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是"脏页",就要先将脏页写到磁盘。
[3]MySQL认为系统"空闲"的时候。
[4]MySQL正常关闭的情况。

       InnoDB的策略是尽量使用内存,因此对于一个长时间运行的库来说,未被使用的页面很少。而当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。

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

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

相关文章

pmos防反保护电路的设计,pmos烧毁原因分析

概述 汽车电源系统常在极为恶劣的环境下运行,数以百计的负载挂在汽车电池上,需要同时确定负载状态的汽车电池可能面临极大的挑战。当负载处于不同工作条件和潜在故障状态时,设计人员需要考虑电源线产生的各种脉冲可能带来的影响。 本系列的上…

VSD Viewer for Mac(Visio绘图文件阅读器)

VSD Viewer for Mac版是mac上一款非常强大的Visio绘图文件阅读器,它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层,查看对象的形状数据,预览超链接。还可以将Visio转换为包含图层,形状数据和超链接的PDF文档。 …

RHEL开发者授权注册

$ sudo subscription-manager register --usernameusername --passwordpassword$ sudo subscription-manager attach --auto查看是否注册 Red Hat 订阅管理,请运行以下命令: $ sudo subscription-manager list --installed

mysql账户密码获取

数据库安装目录 MySQL\data\mysql 里面的user.MYD文件,需要编译查看 数据库里的user表 库下面的user表拿到后,直接解密密码即可 网站配置文件 conn、config、data、sql、common 、inc这些文件 比如pikachu\inc目录下的config.inc.php文件的内容会显示…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境,可以参考文章: 详解如何使用VS code搭建JavaScript环境(适合小白)_vscode配置javascri…

从 15000 家参赛企业脱颖而出,涛思数据荣获中国创新创业大赛“优秀企业”

近年来,以大数据、人工智能、物联网、新型显示、高性能集成电路、5G通信、云计算等为代表的创新技术加速突破应用,在传统行业的数字化转型进程中发挥着重要作用,催生出一系列新产品、新技术、新业态,形成了强劲的数字经济发展新动…

单细胞featureplot美化修改-自定义修改图片样式-umap密度图画等高线

大家好,欢迎来的单细胞图片美化专辑 1.如何修改seruat对象的行名 2.FeaturePlot如何把所有阳性表达的spot放到图的前面 在单细胞实践中,我发现不同的客户对画图需求并不一致,这可能和个人审美有关吧。本专辑着重于各种各样的单细胞个性化绘…

冯·诺依曼体系结构和操作系统

目录 一、冯诺依曼体系结构 1、初见结构 2、对体系结构的理解 3、总结 二、操作系统 1、概念 2、作用 一、冯诺依曼体系结构 1、初见结构 数学家冯诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#xff08…

【C语言】优化通讯录管理系统2

本篇博客是基于上一篇博客写出来的,了解上一篇博客 大家好,我是苏貝,本篇博客带大家再次优化上一篇的通讯录,实现将录入的数据在程序退出后存储到文件中,在下一次程序开始时打开文件获取数据,如果你觉得我写…

耶鲁博弈论笔记

编辑记录: 1126:开个新坑,耶鲁大学的博弈论课程, 和专业相关不大,纯兴趣,尽量写好一点吧 1. 首先指出博弈论是一种研究策略形式的方法,对于经济学中,完全竞争市场只能被动接受均衡…

浏览器中实现可视化的方式有哪几种?带你盘点一下

前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 可视化的含义 浏览器中实现可视化的4种方式 1. HTMLCSS 2. SVG …

鱼哥赠书活动第④期:从0到1Python进阶《利用Python进行数据分析》让你学完成为Python大神!!!

鱼哥赠书活动第④期: 《利用Python进行数据分析》、作译者简介:主要变动:购书链接: 适合阅读对象:赠书抽奖规则:往期赠书福利: 《利用Python进行数据分析》、 Python 语言极具吸引力。自从 1991 年诞生以来…

Linux中Netstat命令最常用的五个用法

当涉及到网络故障排除和网络连接监控时,netstat命令是Linux系统中一个非常常用的工具。netstat命令用于显示与网络相关的统计数据以及网络连接信息。无论是检查网络连接状态、监视网络接口还是查找网络服务的使用情况,netstat命令都能提供有用的信息。在…

视频后期效果制作工具Mocha Pro 2022 Plugins mac中文版软件介绍

Mocha Pro 2022 mac是一款专业的三维摄像机反求摩卡跟踪插件,同时也是一款视频后期效果制作工具,Mocha Pro 2022下载能够给数字媒体艺术家提供强大的、直观的和创新的追踪解决方案用简化的界面、加速的工作流程以及轻松追踪和操作镜头的强大性&#xff0…

conda环境下module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

1 问题描述 在训练语音模型时&#xff0c;出现如下错误&#xff1a; Traceback (most recent call last):File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 660, in <module>run()File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 282, in run…

2023-11-27 事业-代号s-独立站选品工具-记录

摘要: 2023-11-27 事业-代号s-独立站选品工具-记录 选品工具 1. Amazon best seller ‍ 当我们最开始接触选品的时候&#xff0c;最基础也是最重要的选品方法就是Best Seller选品法。 ‍ Best Sellers榜单是每位亚马逊卖家都十分熟悉的&#xff0c;这个榜单是亚马逊基于li…

【【Linux下的Petallinux 以及其他的配置】】

Linux下的Petallinux 以及其他的配置 sudo apt-get install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtoo…

可信区块链运行监测服务平台(TBM)发展研讨会在北京召开

2023年11月23日&#xff0c;由中国信息通信研究院、中国移动通信集团设计院有限公司、区块链服务网络&#xff08;BSN&#xff09;发展联盟共同主办的“可信区块链运行监测服务平台&#xff08;TBM&#xff09;发展研讨会”在北京成功举行。会议围绕区块链的监测与治理&#xf…

【全栈开发】Next.js与RedwoodJS——比较js框架

Next.js和RedwoodJS是两个广泛用于构建web应用程序的JavaScript框架。这两个框架都提供了一系列功能和好处&#xff0c;但它们在方法和理念上有所不同。在本文中&#xff0c;我们将仔细研究Next.js和RedwoodJS&#xff0c;并对它们进行比较&#xff0c;以帮助您为项目选择正确的…

Jupyter Notebook本地部署并实现公网远程访问内网Jupyter服务器【内网穿透】

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…