专栏首页程序猿杂货铺【MySQL(九)| undo log知识补充以及MySQL 系列整理 】

【MySQL(九)| undo log知识补充以及MySQL 系列整理 】

以下内容是对 MySQL undo log 写得补充和总结知识点

重做日志写入过程

相关知识点汇总

原高清图可到公众号后台回复【redo log】 获取

redo log buffer 原理

重做日志缓冲(redo log buffer)是Innodb存储引擎的内存区域中的一部分。

【重做日志信息--(1)-->redo log buffer--(2)-->重做日志文件】

1.关于innodb_log_buffer_size的大小:(默认8M)

我们可以直接使用如下命令查看:

mysql> show variables like 'innodb_log_buffer_size%';
+------------------------+---------+
| innodb_log_buffer_size | 8388608 |
+------------------------+---------+

8388608(Byte)/1024/1024=8M

重做日志缓冲不需要设置的太大,只要保证每秒产生的事务量在缓冲大小范围之内。因为每秒都会刷新缓冲到日志文件,所以一般来说8M足够了。

2.在以下三种情况下,会将重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中。

  • Master Thread 每一秒将重做日志缓冲刷新到重做日志文件;
  • 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
  • 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。

redo log file 原理

重做日志介绍

日志文件名

1.innodb_log_group_home_dir参数指定的目录下有两个文件:ib_logfile0,ib_logfile1

2.该文件被称为:重做日志文件(redo log file),记录Innodb存储引擎的事务日志。至关重要!!!

3.例如:服务器意外宕机导致实例失败,Innodb存储引擎利用重做日志恢复到宕机前的状态,以此保证数据的完整性。

日志文件组

1.每个Innodb存储引擎至少有1个重做日志文件组,每个组至少包含2个重做日志文件(ib_logfile0,ib_logfile1).

2.可以通过设置多个镜像日志组(mirrored log groups),将不同组放到不同磁盘,提高重做日志的高可用性。

3.日志组中的文件大小是一致的,以循环的方式运行。文件1写满时,切换到文件2,文件2写满时,再次切换到文件1.

日志文件参数

1.innodb_log_file_size 重做日志文件的大小。

2.innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2

3.innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1

4.innodb_log_group_home_dir指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。

重做日志文件大小设置
  1. 太大:恢复时可能需要很长时间
  2. 太小:可能导致一个事务需要多次切换重做日志文件;会导致async checkpoint,导致性能抖动。
  3. 错误日志警告信息: InnoDB:ERROR:the age of the last checkpoint is 9433645,InnoDB:which exceeds the log group capacity 9433498.

解析:重做日志有个 capacity 变量,代表最后的检查点不能超过这个阈值,如果超过,必须将缓冲池中脏页列表(flush list)中的部分脏数据页写回磁盘,这是会导致用户线程的阻塞。

二进制日志和重做日志的对比:

1.类别

二进制日志:记录MySQL数据库相关的日志记录,包括InnoDB,MyISAM等其它存储引擎的日志。

重做日志:只记录InnoDB存储引擎本身的事务日志

2.内容

二进制日志:记录事务的具体操作内容,是逻辑日志

重做日志:记录每个页的更改的物理情况

3.时间

二进制日志:只在事务提交完成后进行写入,只写磁盘一次,不论这时事务量多大。

重做日志:在事务进行中,就不断有重做日志条目(redo entry)写入重做日志文件。

重做日志条目

1.条目基本格式

redo_log_type (1字节)

space (压缩后可能<4字节)

page_no

redo_log_body

reod_log_type: 占用1字节,表示重做日志类型。各种不同操作有不同的重做日志格式,但有基本的格式。

space:表空间的ID,采用压缩的方式,占用空间可能小于4字节。

page_no:页的偏移量,同样采用压缩方式

redo_log_body:每个重做日志的数据部分,恢复时需要调用相应的函数解析。

写入过程

1.重做日志信息 先写入 重做日志缓冲 再按一定条件顺序写入重做日志文件!

2.redo log bufferredo log file写,是按 512 个字节,也就是一个扇区的大小进行写入。扇区是写入的最小单位,一定能写入成功.

本文分享自微信公众号 - 程序猿杂货铺(zhoudl_l),作者:zhoudl

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 常用日志框架(Log4j,Slf4j,Logback)之间到底有啥区别

    相信目前大多数情况下,不管是开源框架或是平时我们工作编码中都离不开一种框架,它就是日志框架。因此本篇文章就简单了解一下我们常用日志框架的区别。

    周三不加班
  • LogBack的使用介绍

    Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:

    周三不加班
  • 【LeetCode题解---771】Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S r...

    周三不加班
  • 打印日志时 Logback 内部都做了些什么

    Logback 是一个优秀的开源日志框架,我们很多项目都使用它来记录日志。实际使用时,通常仅需要一行语句即可记录相应的日志信息,如

    有赞coder
  • Spring Boot日志框架实践

    CodeSheep
  • 日志自动分析和解析开源工具

    https://blog.csdn.net/arpospf/article/details/98795806

    lovelife110
  • 【PaperReading】Tools and Benchmarks for Automated Log Parsing

    Jieming Zhu① , Shilin He② , Jinyang Liu③ , Pinjia He④ , Qi Xie⑤ , Zibin Zheng⑥ ,...

    lovelife110
  • 你真的会正确使用日志吗?

    日志在应用程序中是非常非常重要的,好的日志信息能有助于我们在程序出现 BUG 时能快速进行定位,并能找出其中的原因。

    xcbeyond
  • 输出日志需要注意的那些事

    项目都需要输出日志,用于反应系统运行状态或者数据统计。以下内容是个人在服务端系统日志数据的一些经验。

    普通程序员
  • C语言 | C++打印有效日志

    一般在程序上线之后,一旦发生异常,第一件事就是要弄清楚当时发生了什么。用户当时做了什么操作,环境有无影响,数据有什么变化,是不是反复发生等,然后再进一步的确定大...

    C语言入门到精通

扫码关注云+社区

领取腾讯云代金券