mysql重做日志与binlog日志区别_MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...

MySQL中有六种日志文件,分别是

重做日志(redo log)

回滚日志(undo log)

二进制日志(binlog)

错误日志(errorlog)

慢查询日志(slow query log)

一般查询日志(general log)

中继日志(relay log)。

其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

这里简单总结一下这三者具有一定相关性的日志。

重做日志(redo log)

作用:

确保事务的持久性。

防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

内容:

物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

什么时候产生:

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

什么时候释放:

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

对应的物理文件:

默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2

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

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

关于文件的大小和数量,由一下两个参数配置

innodb_log_file_size 重做日志文件的大小。

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

其他:

很重要一点,redo log是什么时候写盘的?前面说了是在事务开始之后逐步写盘的。

之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,

原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

1b07023e493d

然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。

2,每个事务提交时会将重做日志刷新到重做日志文件。

3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。

因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。

这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

回滚日志(undo log)

作用:

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

内容:

逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

什么时候产生:

事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性

什么时候释放:

当事务提交之后,undo log并不能立马被删除,

而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

对应的物理文件:

MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数

如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo 表空间配置参数如下

innodb_undo_directory = /data/undospace/ --undo独立表空间的存放目录

innodb_undo_logs = 128 --回滚段为128KB

innodb_undo_tablespaces = 4 --指定有4个undo log文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

1b07023e493d

其他:

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。

默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。

因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

二进制日志(binlog):

作用:

1,用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

2,用于数据库的基于时间点的还原。

内容:

逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,

也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

在使用mysqlbinlog解析binlog之后一些都会真相大白。

因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。

什么时候产生:

事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。

这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。

因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

什么时候释放:

binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

1b07023e493d

对应的物理文件:

配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。

对于每个binlog日志文件,通过一个统一的index文件来组织。

1b07023e493d

其他:

二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同

1,作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。

2,内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句

3,另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。

4,恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的binlog

关于事务提交时,redo log和binlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用binlog进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

参考:http://www.cnblogs.com/hustcat/p/3577584.html

总结:

MySQL中,对于以上三种日志,每一种细化起来都可以够写一个章节的,这里粗略地总结了一下三种日志的一些特点和作用,以帮助理解MySQL中的事物以及事物背后的原理。

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

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

相关文章

python 绘制三角函数_Python | 绘制三角函数

python 绘制三角函数Trigonometry is one of the most important parts in engineering and many times, therefore matplotlib.pyplot in combination with NumPy can help us to plot our desired trigonometric functions. In this article, we are going to introduce a fe…

《深入理解Elasticsearch(原书第2版)》一2.3.3 把查询模板保存到文件

本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章 ,第2.3.3节,[美]拉斐尔酷奇(Rafal Ku) 马雷克罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 …

python两个中文队列比较_具有两个优先级的优先级队列Python

使用NPE的策略-一个tuple作为队列优先级,tuple是(fpriority, spriority):import Queueclass Job(object):def __init__(self, fpriority, spriority, descriptionblah, iatafoo , hopsample, costfree pitchers):self.fpriority fpriorityself.spriorit…

之江学院第0届 A qwb与支教 容斥与二分

题目链接: http://115.231.222.240:8081/JudgeOnline/problem.php?cid1005&pid0 题目描述: 给你三个数x, y, z 和 N 输出从1开始数第N个不是x, y, z 任意一个数的倍数的数字 解题思路: 一看到倍数我先想到素数唯一分解定理, …

java toarray_Java Vector toArray()方法与示例

java toarray向量类toArray()方法 (Vector Class toArray() method) Syntax: 句法: public Object[] toArray();public Object[] toArray(Type[] ty);toArray() method is available in java.util package. toArray()方法在java.util包中可用。 toArray() method i…

Python基础--环境配置、编码风格、基础概念、基本数据类型(1)

#######python########python的基本[rootdesktop ~]# yum install python -y[rootdesktop ~]# python -V ##查看python版本Python 2.7.5[rootdesktop ~]# python --versionPython 2.7.5为什么用/usr/bin/python关于python脚本中的第一行内容 :#!/usr/bin/python 这种写法表示…

java treemap_Java TreeMap keySet()方法与示例

java treemapTreeMap类的keySet()方法 (TreeMap Class keySet() method) keySet() method is available in java.util package. keySet()方法在java.util包中可用。 keySet() method is used to return a set of keys that exists in this TreeMap to be viewed in a Set. keyS…

mysql简单部署_安装部署Mysql实例(最简单快速噢)

题外话作为Mysql DBA,我们平时必须要熟练的一个最最基础的技能,即安装部署Mysql实例,所以本文分享一个快速安装部署Mysql实例的方法。一、环境介质准备Mysql安装包准备服务器准备我这里使用的是centos 7.x,此方法适用于任何其他li…

zabbix增加手机端4个url地址的返回值

由同事提供4个需要监控的url地址GET类型:http://10.15.24.61:809/UserCenterService.svc/getAccountInfo/563/9638POST类型:http://10.15.24.61:809/ProductService/userInvestVarietyYjsList/4/0/563/1/9638/1.0http://10.15.24.61:809/ProductService/…

java timezone_Java TimeZone setID()方法与示例

java timezoneTimeZone类的setID()方法 (TimeZone Class setID() method) setID() method is available in java.util package. setID()方法在java.util包中可用。 setID() method is used to set the id of this TimeZone. setID()方法用于设置此TimeZone的ID。 setID() metho…

iis php mysql 集成_如何在IIS上集成php(iis+mysql+php+zend)

下面介绍下如何在IIS上集成php、这里我就不说cgi了,因为cgi需要系统权限过高,不建议虚拟主机使用,而且cgi程序也很少有人用到,楼主说的要iis6.0结合php安装需要:windows2003系统 安装有IIS6.0php-5.1.1-Win32.zipmysql…

微信红包促销系统开发

如今,互联网的普及,借助网络,营销更加方便。已经有商家开始与我们合作开发新推出的微信二维码红包促销活动了,不仅能达到活动气氛还能进行防伪,同时还可以给自己的公众号沉淀粉丝。微信红包促销系统开发—— 张小龙作为…

hashmap示例_Java HashMap remove()方法与示例

hashmap示例HashMap类的remove()方法 (HashMap Class remove() method) remove() method is available in java.util package. remove()方法在java.util包中可用。 remove() method is used to remove the key-value pairs that exist in this HashMap for the given key eleme…

mysql 中有行号吗_重置SQLite3 / MySQL中的行号计数

sqlite的使用:DELETE FROM your_table;DELETE FROM sqlite_sequence WHERE name your_table;sqlite keeps track of the largest ROWID that a table has ever held using the special sqlITE_SEQUENCE table. The sqlITE_SEQUENCE table is created and initializ…

『科学计算』科学绘图库matplotlib练习

思想:万物皆对象 作业 第一题: import numpy as np import matplotlib.pyplot as pltx [1, 2, 3, 1] y [1, 3, 0, 1]def plot_picture(x, y):plt.plot(x, y, colorr, linewidth2, linestyle--, markerD, labelone)plt.xticks(list(range(-5,5,1)))plt.…

Java BigDecimal min()方法与示例

BigDecimal Class max()方法 (BigDecimal Class max() method) max() method is available in java.math package. max()方法在java.math包中可用。 max() method is used to return the least value of (this BigDecimal) and the given (BigDecimal ob). max()方法用于返回(t…

mysql下载64位 csdn_Linunx-CentOS7安装mysql-5.7.23-linux-glibc2.12-x86_64.tar

2. Linux下安装Mysql2.2 将下载好的mysql安装包通过xftp上传到虚拟机上。2.3 将安装包移动到/usr/local路径下#mv mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz /usr/local2.4 解压安装包#tar -zxvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz2.5 重命名解压文件或者是建立软…

tempdb 相关总结

/* -- 0. 高速压缩tempdb为初始值 USE tempdb DBCC SHRINKFILE(2,TRUNCATEONLY); */-- 1. tempdb以下未回收的暂时表 ,某些版本号可能查不到数据 use tempdb; select * from sys.objects o where o.type like %U%;-- Chapter 7 - Knowing Tempdb -- christiancoeo.com-- Show t…

java calendar_Java Calendar after()方法与示例

java calendarCalendar类after()方法 (Calendar Class after() method) after() method is available in java.util package. after()方法在java.util包中可用。 after() method is used to check whether this calendar time is after the time denoted by the given Objects …

rust拆掉墙_rust怎么拆自己的墙

rust游戏中可以建造自己的家,但是当建墙的时候总会觉得摆放不好,所以就需要拆除,但是要怎么拆自己的墙呢,下面小编就来为大家介绍一下吧!rust怎么拆自己的墙要先放上领地柜,然后在墙刚建好的几分钟内锤子右…