这篇文章将为大家详细讲解有关MySQL日志模块的简介,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>目录强>
一、简介
三。binlog
<强> MySql学习专栏强>
1。MySQL基础架构详解
2。MySQL索引底层数据结构与算法
3。MySQL5.7开启binlog日志,及数据恢复简单示例
4。MySQL日志模块
一、简介
MySQL 有两大重要的日志模块:redo log(重做日志)和 binlog(归档日志)。
redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志,但两者记录的格式不同。
二、redo log
redo log: 又称(重做日志)文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。
在media failure时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。
InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新一般是在系统比较空闲的时候完成的,以此来提升更新效率。
这里涉及到 WAL 即 Write-Ahead Logging 技术,他的关键点就是 先写日志,再写磁盘。
InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么总共就可以记录 4GB 的操作。
redo log会从头开始写,写到末尾就又回到开头循环写,如下图所示。
write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。
check point 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
write pos 和 check point 之间的是未使用的部分,可以用来记录新的操作。
如果 write pos 追上 check point,表示redo log记录满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 check point 推进一下。
有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。
为什么要使用redo log日志?
假如我们对数据库进行DML操作,直接把执行SQL写入磁盘,当写入并发较大时,对数据写入磁盘的压力会造成一定影响,
当我们插入操作是,发现当前非叶子节点一页数据量不够时,要进行分页算法,效率会比较低;
当我使用redo log日志,先把我们DML操作写入日志,通过一个"中转站",空闲时候再通过check point 写入磁盘,效率会高很多;
MySQL设置Redo Log
写入日innodb_log_buffer_size的大小:(默认8M)
innodb_log_file_size 重做日志文件的大小。
innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2
innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1
innodb_log_group_home_dir 指定日志文件组所在的路径,默认./,表示在数据库的数据目录下
李> <李><强> innodb_flush_log_at_trx_commit 强>设置提交时如何将日志缓冲区中日志刷日志文件中(值0,1,2)默认1
李>
<强>三。binlog 强>
重做日志是InnoDB引擎特有的日志,而服务器层也有自己的日志,称为<强> binlog(归档日志)强>。
为什么会有两份日志呢?