MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行
笔记记录自林晓斌(丁奇)老师的《MySQL实战45讲》
2) --日志系统,一条SQL查询语句如何执行
MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关。上一篇中记录了一条查询语句是如何执行的,对于更新语句,这一套流程也是同样会走一遍。与查询流程不一样的是,更新流程还涉及到两个重要的日志模块。redo log(重做日志) 和 binlog(归档日志)。
redo log:
这里林老师举了一个很好的例子,摘录如下。
《孔乙己》中的酒店掌柜有一个粉板,用来记录客人的赊账记录。如果赊账的人不多,他可以把顾客名和账目写在粉板上。如果赊账的人太多,粉板写不下了,掌柜的还会有一个专门记录赊账的账本。如果有人要赊账或者还账的话,掌柜的一般有两种做法:
- 一种做法是直接把账本翻出来,把这次赊账的记录加上去或者除掉。
- 另一种做法是先再粉板上记下这次的账,等打烊以后再把账本翻出来核算。
如果客人太多,掌柜的一定会选择后者,因为前者的操作实在是太麻烦了。要在账本上翻上个几十页再一条条的查找,然后再用算盘计算。相比之下,在粉板上记录下来就简单的多。
同样,在MySQL里也会有这个问题。如果每次更新操作都要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本及查找成本都很高。
- MySQL中这种类似粉板和账本配合的过程就是WAL技术(Write-Ahead Logging)它的关键点是先写日志,再写磁盘。
- 当一条记录需要更新时,InnoDB引擎就会先把记录写到redo log里面,并更新内存(粉板)。同时,InnoDB引擎会在适当的时候将他更新到磁盘里(账单)。
- redo log的大小是固定。因此如果系统繁忙,redo log很快就会写满。此时就不得不先把一部分记录更新到磁盘里,然后再进行后续的写入。
- 有了redo log, InnoDB就可以保证记录不会丢失,这个能力称为 crash-safe。(掌柜把记录写入了粉板,没写入账单。晚上掌柜的忘记这件事了(DB异常重启),一看粉板(redo log)也可以重新写入账单)
binlog:
- 之前提到过MySQL分为两层,一是Server层,另一个是引擎层。redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,成为binlog(归档日志)
- redo log 与 binlog 有三点不同:
- redo log是InnoDB引擎特有的日志,binlog是MySQL的Server层实现,所有引擎都可以使用。
- redo log是物理日志,记录的是“在某个数据页上做了什么操作”;binlog是逻辑日志,记录是语句的原始逻辑,比如“给ID=2这一行的c字段加1”.
- redo log大小固定,循环写入。binlog可以追加写,不会覆盖以前的日志。
两阶段提交:

(图片来源于 极客时间 林晓斌 《MySQL 实战45讲》,如有版权问题请联系我删除)
可以看到最后一部分把redo log拆成了两部分,prepare和commit,这就是“两阶段”提交。
关于两阶段提交,如果不这样做的话则上述过程会演变成先写完redo log或者先写完binlog,假设在写完一个log,正在写第二个log时发生异常
- 先写redo log:前面有提到,由于redo log已经写完,仍能将redo log中的数据恢复回来。但由于binlog中没有这个记录,所以当你使用binlog来恢复临时库时,临时库便会少一次逻辑上的更新,即临时库认为没有这次的更新,故与原数据不同。
- 先写binlog:由于binlog已经写完,恢复临时库时会执行这次的操作,但redo log中并没有相关记录,这个事务无效也无法恢复,与=原数据不同。
另:innodb_flush_log_at_trx_commit这个参数设置为1表示把redo log直接持久化到磁盘,保证mysql异常重启之后数据不丢失。
sync_binlog设置为1时表示binlog持久化到磁盘,保证mysql异常重启后binlog不丢失。
上篇问题答案:
如果表T中没有字段k,而去执行这个语句 select * from T where k = 1,那么会报错“Unknown column ‘k’ in ‘where clause’”。请问这个错误是在哪个阶段报出的?
答案是 分析器。笔记中有暗示啦,
分析器:分析器会先做“词法分析”,即从你输入的"select"这个关键字识别出来这是一个查询语句,把你输入的字符串“ID”识别成“列ID”。之后会进行“语法分析”,判断你输入的sql语句是否满足语法规则。
问题:
请问在什么场景下,一天一次备份会比一周一次备份更有优势?或者说,它影响了这个数据系统的哪些指标?
MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行的更多相关文章
- MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行
最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...
- 1 基础架构:一条sql查询语句如何执行?
1 基础架构:一条sql查询语句如何执行? 分析一个最简单的查询 mysql> select * from T where ID=10: MySQL基本架构示意图 大体来说,mysql可以分为s ...
- mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?
本文基于----MySQL实战45讲(极客时间----林晓斌 )整理----->https://time.geekbang.org/column/article/68319 一.第一节:一条sq ...
- mysql系列-⼀条SQL查询语句是如何执⾏的?
⼀条SQL查询语句是如何执⾏的? ⼤体来说,MySQL 可以分为 Server 层和存储引擎层两部分 Server 层 Server 层包括连接器.查询缓存.分析器.优化器.执⾏器等,涵盖 MySQL ...
- 一文读懂一条 SQL 查询语句是如何执行的
2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...
- 01.基础架构:一条SQL查询语句是如何执行的?学习记录
01.基础架构:一条SQL查询语句是如何执行的?学习记录http://naotu.baidu.com/file/1c8fb5a0f2497c3a2655fed89099cb96?token=ff25d ...
- MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...
- mysql实战45讲读书笔记(一) 一条SQL查询语句是如何执行的
我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MySQL的学习也是这样.平时我们使用数据库,看到的通常都是一个整体.比如,你有个最简单的表 ...
- 一条SQL查询语句是如何执行的?
本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_inf ...
随机推荐
- spring-cloud-Zuul学习(一)【基础篇】--入门案例【重新定义spring cloud实践】
-- 2 ...
- JetBrains系列IDE快捷键大全(转载)
编辑 快捷键组合 说明 Ctrl + Space 代码自动完成提示(选择) Alt + Enter 显示意图动作和快速修复 Ctrl + P 参数信息 (在调用方法参数忘记的时候,提示) Ctrl + ...
- CentOS 5.9裸机编译安装搭建LAMP
Linux系统:CentOS 5.9,查看CentOS版本,命令如下: [root@localhost /]# cat /etc/redhat-release CentOS release 5.9 ( ...
- 刚发现 CSS 还存在一个命名规范 B.E.M
Block !误区:这个block并非inline-block里的block,而是将所有东西都划分为一个独立的模块,一个header是block,header里嵌套的搜索框是block,甚至一个ico ...
- NP-Completeness理解
今天大年初一,哪里也没去,在家里重新看了下IOA的NP问题.感觉看明白了. 首先定义下: 所谓P问题是指所有能在多项式复杂度解决的问题,比如排序算法,n*n复杂度解决问题. 有些问题目前没有多项式复杂 ...
- 分门别类总结Java中的各种锁,让你彻底记住
概念 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥 ...
- AI - TensorFlow - 起步(Start)
01 - 基本的神经网络结构 输入端--->神经网络(黑盒)--->输出端 输入层:负责接收信息 隐藏层:对输入信息的加工处理 输出层:计算机对这个输入信息的认知 每一层点开都有它相应的内 ...
- SpringBoot 集成Mybatis 连接Mysql数据库
记录SpringBoot 集成Mybatis 连接数据库 防止后面忘记 1.添加Mybatis和Mysql依赖 <dependency> <groupId>org.mybati ...
- tensorflow 1.0 学习:十图详解tensorflow数据读取机制
本文转自:https://zhuanlan.zhihu.com/p/27238630 在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找 ...
- Lucene 01 - 初步认识全文检索和Lucene
目录 1 搜索简介 1.1 搜索实现方案 1.2 数据查询方法 1.2.1 顺序扫描法 1.2.2 倒排索引法(反向索引) 1.3 搜索技术应用场景 2 Lucene简介 2.1 Lucene是什么 ...