MySQL基础架构和日志系统

MySQL基础架构和日志系统

  • 1,逻辑架构图
    • 1.1 连接器
    • 1.2.1 查询缓存
    • 1.2.2 分析器
    • 1.3 优化器
    • 1.4 执行器
  • 2,日志系统
    • 2.1 redo log(重做日志)
    • 2.2 binlog(归档日志)
    • 2.3 两阶段提交
      • 2.3.1 崩溃恢复机制是什么?
      • 2.3.2 如何知道binlog是否完整?
      • 2.3.3 redo log 和binlog如何关联的?
      • 2.3.4 为什么不用binlog来做崩溃恢复?
      • 2.3.5 redo log 一般设置多大?

本文主要内容来源于《MySQL实战45讲》(作者:林晓斌),是自己做了一下归纳整理的学习笔记。

1,逻辑架构图

在这里插入图片描述

大体来说,MySQL分为Server层和存储引擎层两部分。

  • Server层:涵盖MySQL的大多数核心服务功能,所有跨存储引擎的功能都在这一层实现,如内置函数、存储过程、触发器、视图等。
  • 存储引擎层:负责数据的存储和提取,其架构是插件式的,支持InnoDB、MyISAM、Memory等

1.1 连接器

负责跟客户端建立连接、获取权限、维持和管理连接。

-- 建立连接
mysql -h$ip -P$port -u$user -p-- 查询连接
show processlist

一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。只有再新建的连接,才会使用新的权限设置。

1.2.1 查询缓存

MySQL执行一个查询请求后,会把查询结果以key(查询语句)-value(查询结果)的形式存入查询缓存中,下次查询相同语句会直接从查询缓存中返回结果,效率很高。

但查询缓存弊大于利,建议关闭。甚至MySQL 8.0 版本已将查询缓存删掉了,没有这个功能了。

因为查询缓存失效非常频繁,只要对某个表进行更新操作,这个表上所有查询缓存都会被清空。

1.2.2 分析器

  1. 词法分析:识别SQL字符串中表名、字段名等。
  2. 语法分析:判断语句是否满足 MySQL 语法。

1.3 优化器

确定最终执行计划:

  1. 多个索引时索引的选择;
  2. 多表关联join时,各个表的连接顺序等;

1.4 执行器

返回结果:

  1. 判断用户对执行的表是否有权限;
  2. 执行器根据表的引擎定义,去使用这个引擎提供的接口;

2,日志系统

  • Service层:binlog(归档日志)
  • 引擎层:InnoDB特有的redo log(重做日志)

2.1 redo log(重做日志)

如果每次更新时,都需要在磁盘中找到对应的记录,然后更新并将新数据写进磁盘,整个过程的IO成本、查找成本都很高。

为了提升效率,InnoDB引擎使用了WAL 技术(Write-Ahead Logging),即先写日志,再写磁盘。
具体来讲,当有一条记录需要更新时,InnoDB引擎会先把记录写到redo log中,并更新内存,这时更新就算已经完成。在系统比较空闲时,再把这个更新操作记录到磁盘里(redo log文件名:ib_logfile+数字)。

redo log 是固定大小的,可以配置。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示:
在这里插入图片描述
write pos 是当前记录的位置,checkpoint 是当前要擦除的位置(在擦除记录前要把记录更新到磁盘的数据文件中),它们都是往后推移并且循环的。

write pos 和 checkpoint 之间空的部分可以用来记录新的操作,如果两者重合,则不能再执行新的更新,需要把一些数据写进磁盘,让checkpoint 往后移动才行。

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。

redo log 的写入机制:

  1. 写入redo log buffer‌:‌事务在执行过程中,生成的 redo log 是要先写到 redo log buffer,‌这个buffer位于MySQL进程的内存中;
  2. 写入文件缓存(‌write)‌‌:‌redo log被写入到磁盘文件系统的page cache里面。‌
  3. 持久化到磁盘(‌fsync)‌‌:‌InnoDB 提供了 innodb_flush_log_at_trx_commit 参数控制写入磁盘的策略。‌
  • innodb_flush_log_at_trx_commit=0,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;
  • innodb_flush_log_at_trx_commit=1,表示每次事务提交时都将 redo log 直接持久化到磁盘;
  • innodb_flush_log_at_trx_commit=2,表示每次事务提交时都只是把 redo log写到 page cache。

建议:innodb_flush_log_at_trx_commit=1

此外,没有提交的事务也会被MYSQL写入到磁盘:

  • MYSQL 会有一个后台线程,每隔1秒把redo log buffer 持久化到磁盘, 直接经过file cache到磁盘。
  • 如果并发的事务提交落盘后也会连带着把另外一个事务的redo log buffer持久化到磁盘。 redo log buffer
  • 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动写盘来减少 redo log buffer的空间占用

2.2 binlog(归档日志)

redo log是InnoDB引擎特有的日志,Service层也有自己的日志:binlog(归档日志)。

为什么要有两份日志呢?
因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。InnoDB是另外的公司以插件形式引入MySQL的,为了弥补其没有crash-safe能力而实现的redo log。

两种日志主要有三个不同点:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2 这一行的 c 字段加 1 ”。
  3. redo log 是循环写的,空间固定,用完后覆盖前面日志;binlog 是追加写入的,当文件写到一定大小后会切换到下一个,不会覆盖以前的日志。

binlog 的写入机制:

  1. 写到 binlog cache:事务执行过程中,先把日志写到 binlog cache;
  2. 写入文件缓存(‌write)‌‌:‌事务提交的时候,再把 binlog cache 写到文件系统的缓存 page cache中;
  3. 持久化到磁盘(‌fsync)‌‌:‌最后mysql会根据你的sync_binlog配置决定什么时候刷新到磁盘binlog文件中;
  • sync_binlog=0,表示每次提交事务都只 write,不 fsync;
  • sync_binlog=1,表示每次提交事务都会执行 fsync;
  • sync_binlog=N(N>1) ,表示每次提交事务都 write,但累积 N
    个事务后才 fsync。

在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成 0。但是,将 sync_binlog 设置为 N,对应的风险是:如果主机发生异常重启,会丢失最近 N 个事务的 binlog 日志。
建议:sync_binlog = 1 每次事务的binlog都持久化到磁盘

一个事务的 binlog 是不能被拆开的,不论这个事务多大,也要确保一次性写入。系统给每个线程都分配了一片 binlog cache内存,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。

2.3 两阶段提交

在这里插入图片描述

这里的关键部分是,redo log 的写入拆成了两个步骤:prepare 和 commit。这就是所谓的"两阶段提交"。

为什么会有两段提交呢?是为了让两份日志之间的逻辑一致。如果不一致,则数据库的数据和用binlog恢复或者同步出来的数据会不一致。

2.3.1 崩溃恢复机制是什么?

情况1:写入redo log后,写入binlog之前崩溃,因为未commit,事务回滚,redo log也会回滚;
情况2:写入redo log,又写入binlog后,commit之前崩溃:

  • 如果rodo log 里面事务是完整的(有commit标识),则直接提交;
  • 如果redo log里面事务只有prepare,则判断binlog是否存在且完整:
    a,如果是,则提交事务
    b,如果否,回滚事务

2.3.2 如何知道binlog是否完整?

一个事务的binlog是由完整格式的:

  • statement格式的binlog,最后会有COMMIT;
  • row格式的binlog,最后会有一个XID event;
  • MySQL5.6.2以后,引入binlog-checksum参数,用来验证binlog内容的正确性;

2.3.3 redo log 和binlog如何关联的?

他们有一个共同的数据字段XID。
情况2时,会拿redo log的XID去binlog中找对应的事务。

2.3.4 为什么不用binlog来做崩溃恢复?

因为binlog不支持崩溃恢复。

MySQL原生引擎MyISAM在设计之初就没有支持崩溃恢复。binlog的目的主要用于数据复制和某些类型的增量备份,‌它虽然保存了全量的日志,‌但没有提供崩溃恢复的功能。

最重要的是,binlog是追加写的,‌但没有一个标志让 innoDB 判断哪些数据已经入表(写入磁盘),哪些数据还没有。

2.3.5 redo log 一般设置多大?

redo log 太小的话,会导致很快被写满,然后不得不强制刷redo log到磁盘,WAL机制的能力有发挥不出来。
如果几个TB的磁盘,直接将redo log设为4个文件,每个文件1GB.
innodb_log_files_in_group=4
innodb_log_file_size=1000M

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I.MX6U交叉编译Qt项目-思维导图-学习笔记-基于正点原子阿尔法开发板

I.MX6U交叉编译Qt项目 安装交叉编译器 交叉编译器介绍 拷贝fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh至ubuntu 执行下面的指令修改脚本的权限,修改权限后可以看到此脚本颜色显示改变,说明修改成功 chmod…

QT事件机制理解

事件和信号 从硬件层来看: 事件就是一种中断, 中断的产生形式: 1.用户操控硬件所产生的中断。 2.由系统自身所产生的中断,比如说定时器。 这种中断由系统内核监控,由系统内核接收到中断并向CPU发出的执行请求就叫信号。所以说事件是信号产生…

异步交互技术Ajax

目录 一、同步交互和异步交互 二、Ajax 1.概述 2.如何实现ajax请求 三、异步传输数据乱码的问题 regist.html页面代码 服务端代码处理 一、同步交互和异步交互 同步交互:在同步交互中,参与的各方在同一时间进行交流。请求一项操作后,发…

这样理解嵌入式术语

1.裸机开发:n个人拉屎,先进去一个拉完,下一个再来; 2.看门狗:如果有人拉完屎还占着茅坑刷视频,把他拖出去 3.中断系统:n个人拉屎,先进去的拉完,下一个再来。如果有拉肚…

陪跑案例 | 德国营养师吴迪:从胖妹逆袭塑形导师!公开首场发售秘籍

有目标,有心力的老师,一旦找对方法和团队,能够化解99%的问题。 今天,创客匠人【陪跑案例故事】专栏推出第四期内容,为大家介绍【梦想身型健康学院】平台创始人吴迪老师的陪跑故事。 吴迪老师是梦想身型训练营创始人、德…

海外媒体投稿:5个软文代发推广入门技巧

1. 软文代发概述 软文代发是一种通过第三方渠道发布软文的推广方式。它可以帮助小白快速上手推广,提高品牌知名度、产品销量等。软文代发不仅能够吸引更多的目标用户,还能提高网站的流量和转化率,从而带来更多的商机。 2. 明确目标受众和需求…

【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】

0 ref属性&#xff08;组件间通信&#xff09; # 1 ref属性放在普通标签上<input type"text" v-model"name" ref"myinput">通过 this.$refs[myinput] 拿到的是 原生dom对象操作dom对象&#xff1a;改值&#xff0c;换属性。。。# 2 ref属…

Java项目集成RocketMQ

文章目录 1.调整MQ的配置1.进入bin目录2.关闭broker和namesrv3.查看进程确认关闭4.编辑配置文件broker.conf&#xff0c;配置brokerIP15.开放端口109116.重新启动1.进入bin目录2.启动mqnamesrv和mqbroker1.启动 NameServer 并将输出重定向到 mqnamesrv.log2.**启动 Broker 并将…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…

【数据结构】队列的实现

0. 前言 上期博客给大家讲解了 栈 以及 栈的实现&#xff0c;今天再给大家讲一个特殊的顺序表结构&#xff0c;那就是队列&#xff01; 下面就进入正题&#xff01;一起学习一下吧&#xff01; 1. 队列 1.1 队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&…

多媒体技术及应用课程思政网站

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括多媒体技术及应用课程思政网站的网络应用&#xff0c;在外国多媒体技术及应用课程思政已经是很普遍的方式&#xff0c;不过国内的多媒体技术及应用课程思政可能还处于起…

WPF Mvvm

了解MVVM 什么是MVVM&#xff1a;一种设计模式 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人…

网络招商是什么意思,主要干什么工作?

互联网时代&#xff0c;网络招商&#xff0c;已经是企业不可缺少的一部分&#xff0c;这篇文章&#xff0c;详细为大家分享&#xff0c;网络招商的意思&#xff0c;以及主要工作内容&#xff01; 一、网络招商意思 就是利用互联网进行招商的一种方式&#xff0c;借助互联网的…

【深度学习】直观理解AUROC

文章目录 前言如何计算直观解释常用计算方式 前言 AUROC常用于衡量二分类分类器的性能&#xff0c;本文旨在详解该指标计算过程 如何计算 设想我们有一个分类器&#xff0c;对数据做二分类。我们设输入数据为 x x x, 预测标签为 y y y, ground-truth标签为 y ^ \hat{y} y…

docker 拉取镜像 error pulling image configuration: download failed ****

问题&#xff1a; 在安装docker后拉取镜像的时候 出现error pulling image configuration: download failed ****异常 原因&#xff1a; 由于镜像源配置的问题引起的镜像拉取异常 解决 由于网络或者其他原因导致拉取镜像请求失败&#xff0c;报错&#xff1a; error pulli…

Oracle 用户-表空间-表之间关系常用SQL

问题&#xff1a; 当某一个表数据量特别大&#xff0c;突然插入数据一直失败&#xff0c;可能是表空间不足&#xff0c;需要查看表的使用率 用户-表空间-表之间关系&#xff1a;用户可以有多个表空间&#xff0c;表空间可以有多个表&#xff0c;表只能拥有一个表空间和用户 1.…

爱心动画代码HTML5

这段代码是一个HTML5 Canvas动画&#xff0c;它通过JavaScript创建了一个动态的爱心效果。页面初始化时&#xff0c;首先定义了一些基本设置&#xff0c;如粒子数量、持续时间、速度等。然后&#xff0c;定义了Point和Particle类&#xff0c;用于处理粒子的位置和运动。接着&am…

C语言数据类型和变量

数据类型介绍 数据类型介绍 C语言提供了丰富的数据类型来描述生活中的各种数据。 使用整型类型来描述整数&#xff0c;使用字符类型来描述字符&#xff0c;使用浮点型类型来描述小数。 所谓“类型”&#xff0c;就是相似的数据所拥有的共同特征&#xff0c;编译器只有知道了数…

软件测试经典面试题,助你面试加分

Hi&#xff0c;大家好&#xff0c;进入金九银十&#xff0c;很多小伙伴有被动跳槽的打算&#xff0c;所以更新一些经典的软件测试面试题&#xff0c;希望能帮到大家&#xff01; 时间紧迫的情况下&#xff0c;如何做好测试工作&#xff1f; 对需求要明确&#xff0c;对需求的优…

iPhone如何全选删除照片:一步到位的清理指南

随着时间的推移&#xff0c;iPhone中的照片会迅速累积&#xff0c;最终可能占据大量的存储空间。无论是为了释放空间&#xff0c;还是整理照片库&#xff0c;iPhone如何全选删除照片成为许多用户的需求。然而&#xff0c;iPhone原生的“照片”应用并没有直接提供“全选删除”功…