Mysql 系列 | 日志模块
了解了 SQL 执行的流程,知道每一条语句都经过连接器、查询存储、分析器、优化器、执行器最后到存储引擎的过程。查询语句是如此,更新语句也不例外。
不同的是,更新语句会修改表数据,这里就涉及到两个重要的日志模块 redolog 和 binlog。
本篇还是选用 InnoDB 搜索引擎。
系统的日志模块
之一 redolog
下面引入丁奇的经典比喻。
《孔乙己》这篇文章中,酒店掌柜有一个粉板,专门用来记录客人的赊账记录。
如果赊账的人不多,他可以把顾客名和账目写在板上。
但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。
如果有人要赊账或者还账的话,掌柜一般有两种做法:
一是直接把账本翻出来,把这次赊的账加上去或者扣除掉;
另一种是先在粉板上记下这次的账,等打烊以后再把账本翻出来核算。
在生意红火柜台很忙时,掌柜一定会选择后者,因为前者操作实在是太麻烦了。
首先,你得找到这个人的赊账总额那条记录。你想想,密密麻麻几十页,掌柜要找到那个名字,可能还得带上老
花镜慢慢找,找到之后再拿出算盘计算,最后再将结果写回到账本上。
你想想,如果掌柜没有粉板的帮助,每次记账都得翻账本,效率是不是低得让人难以忍受?
上面的比喻非常形象地说明了 Mysql 中的 WAL(Write-Ahead-Logging) 技术。
先写日志(redolog),再写磁盘。也就是先写粉板再写账本。
redolog 是 InnoDB 引擎特有的日志。
当有数据要更新时,InnoDB 会先记录 redolog,同时更新内存,更新操作就结束了。等到合适的时候(空闲或者粉板写满了),再更新磁盘。
redolog 有固定大小,就像固定大小的粉板,写满就得回到开头循环写。
write pos 是当前记录粉板的位置,一边写一边往后移。
check point 是擦除的位置,擦除前会把更新记录到数据文件。
redolog 保证了数据库异常重启时数据不丢失,这个能力被称为 crash-safe。

(丁奇原图)
- redolog 默认在 Mysql 的 data 目录下,ib_logfile0、ib_logfile1、。。。
mysql> show variables like "innodb_log_group_home_dir";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./ |
+---------------------------+-------+
1 row in set (0.00 sec)
- 设置 redolog 文件大小及个数,默认 2 个文件(innodb_log_files_in_group),每个文件 32M(innodb_log_file_size)
mysql> show variables like "innodb_log_file%";
+---------------------------+----------+
| Variable_name | Value |
+---------------------------+----------+
| innodb_log_file_size | 33554432 |
| innodb_log_files_in_group | 2 |
+---------------------------+----------+
2 rows in set (0.00 sec)
- 设置 redolog 实时直接持久化到磁盘上,保证重启后数据不丢失。
mysql> show variables like "innodb_flush_log_at_trx_commit";
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
1 row in set (0.00 sec)
之二 binlog
binlog 是 Server 层的日志,叫归档日志。不同于 redolog 只有 InnoDB 有,binlog 任何引擎都可以使用。
binlog 是逻辑日志,记录语句的原始逻辑;redolog 是物理日志,记录数据页的修改内容。
binlog 不会循环写,一个写完后切换到写一个;redolog 有固定的大小。
binlog 在 data 目录下,mysql-bin.xxxxxx。
设置 binlog 每次事务直接持久化到磁盘上,保证重启后数据不丢失。
mysql> show variables like "sync_binlog";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.00 sec)
update 的执行过程
update T set c=c+1 where ID=2;
执行器调用引擎接口找 ID=2 的数据,如果 ID=2 数据所在的数据页在内存中,则直接返回给执行器。否则先从磁盘读取再返回。
执行器拿到数据,把 c 加 1,得到新的一行数据。然后调用引擎接口,写入这行数据。
引擎将新数据更新到内存中,顺便记录 redolog,此时 redolog 处于 prepare 状态,然后告诉执行器可以提交事务。
执行器把 binlog 写入磁盘,然后调用引擎接口提交事务。redolog 状态变为 commit。更新完成。
数据恢复
既然记录了 log,那么当数据误操作后,就可以根据数据库定期备份,加上记录的 log 方便的恢复到误操作之前的状态。
先根据备份恢复到临时表
根据 binlog 找到备份后到误操作前的记录。
把恢复好的临时库按需要同步到正式库中。
只要有 log,就可以恢复到任何时刻的数据状态。
再也不用担心误操作无法恢复了。
Mysql 系列 | 日志模块的更多相关文章
- MySQL慢日志功能分析及优化增强
本文由 网易云发布. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据.本 ...
- MySQL慢日志线上问题分析及功能优化
本文来源于数据库内核专栏. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据 ...
- 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5932cde42f1f03de29b1 本文来源: 微信客户端开发团队 ...
- openresty开发系列36--openresty执行流程之6日志模块处理阶段
openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...
- go系列(6)- beego日志模块的使用
1.安装日志模块 切换到工作目录,下载日志模块 cd /data/work/go/ go get github.com/astaxie/beego/logs 2.导入日志模块 使用的时候,需要导入模块 ...
- 【Gin-API系列】Gin中间件之日志模块(四)
日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...
- 一生挚友redo log、binlog《死磕MySQL系列 二》
系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
随机推荐
- 快速创建简单的mybatis应用
1.导包(配置pom.xml) 一定要用这个网站:https://mvnrepository.com/ 点击查看代码 <dependency> <groupId>org.myb ...
- ES6片段
那些可能会忘记或不知所以然的点: 1. 2. 3. 4. 5. 6. /* 函数调用会在内存形成一个"调用记录",又称调用帧,保存调用位置和内存变量等信息. 如果在函数 A 的内部 ...
- linux项目部署(非前后端分离crm)
参考博客 参考博客2---部署过程 导论:看参考博客1 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收 ...
- 隔离这几天开发了一个带控制台的OAuth2授权服务器分享给大家
停更这些天,业余时间和粉丝群的几个大佬合作写了一个基于Spring Authorization Server的OAuth2授权服务器的管理控制台项目Id Server,我觉得这个项目能够大大降低OAu ...
- 如何使用Python实现图像融合及加法运算?
摘要:本篇文章主要讲解Python调用OpenCV实现图像融合及加法运算,包括三部分知识:图像融合.图像加法运算.图像类型转换. 本文分享自华为云社区<[Python图像处理] 五.图像融合.加 ...
- Golang:手撸一个支持六种级别的日志库
Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...
- 标注工具doccano导出数据为空的解决办法
地址:https://github.com/taishan1994/doccano_export doccano_export 使用doccano标注工具同时导出实体和关系数据为空的解决办法.docc ...
- 121_Power Query之R.Execute的read.xlsx&ODBC
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.问题 pq在用 Excel.Workbook 读取一些Excel早期版本(.xls后缀)的文件时候,报错:DataFo ...
- Git移除远程已经上传的文件
我们常常会将本地的一些秘钥文件不小心推送到远端,此时仅仅修改本地的.gitignore文件,然后再提交推送是不能将远端的此文件删除的. 此时可以用下面的命令 git rm --cached filen ...
- nginx 代理请求导出功能bug解决方法
问题描述: nginx代理的ip直接访问可以直接下载文件,但是通过nginx访问就报502,nginx错误日志:upstream sent invalid chunked response while ...