mysql有多少种日志_MySQL到底有多少种日志类型必须我们记住的!
MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。
其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有必定的关系日志分类学生,这三种日志,对理解MySQL中的事务操作有着重要的意义。
这里简单小结一下这两者具有必定相关性的日志。
一、重做日志(redo log)
1、作用
确保事务的持久性。
防止在出现故障的时间点,尚有脏页未读入磁盘,在重启mysql服务的之后,根据redo log进行重做,从而超过事务的持久性这一特点。
2、内容
物理格式的日志,记录的是物理数据页面的更改的信息,其redo log是排序写入redo log file的物理文件中去的。
3、什么时候产生
事务开始以后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始读取redo log文件中。
4、什么时候释放
当对应事务的脏页写入到磁盘然后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。
5、对应的物理文件
默认状况下,对应的物理文件位于的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
6、其他
很重要一点,redo log是哪个之后写盘的?前面说了是在事物开始以后逐渐写盘的。
之所以说重做日志是在事务开始以后逐渐写入重做日志文件,而不一定是事务提交才读取重做日志缓存,
原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。
然后会借助以上三种方法将innodb日志缓冲区的日志刷新到磁盘
1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。
2,每个事务提交时会将重做日志刷新到重做日志文件。
3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件
由此可以看出,重做日志通过不止一种方式读取到磁盘,尤其是针对第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。
因此重做日志的写盘,并不必定是随着事务的递交才读取重做日志文件的,而是随着事务的起初,逐步开始的。
另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:
即使某个事务还没有提交,Innodb存储引擎依然每秒会将重做日志缓存刷新到重做日志文件。
这一点是需要要知道的,因为这可以较好地解释再大的事务的提交(commit)的时间也有很短暂的。
二、回滚日志(undo log)
1、作用
保存了事务出现之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
2、内容
逻辑格式的日志,在执行undo的之后,仅仅是将数据从逻辑上恢复至事务之前的状况,而不是从物理页面上操作推动的,这一点是不同于redo log的。
3、什么时候产生
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来确保undo log的可靠性
4、什么时候释放
当事务提交以后,undo log并不能立马被删除,
而是放在待清理的数组,由purge线程判断能否由其它事务在使用undo段中表的上一个事务之前的版本信息,决定能否可以清理undo log的日志空间。
5、对应的物理文件
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配置。
6、其他
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中的日志记录。
3、什么时候产生
事务提交的之后,一次性将事务中的sql子句(一个事物也许对应多个sql子句)按照一定的格式记录到binlog中。
这里与redo log很明显的差别就是redo log并不必定是在事务提交的之后刷新到磁盘,redo log是在事务开始以后就起初逐步写入磁盘。
因此针对事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在进入了bin_log的状况下,对于较大事务的提交,可能会变得非常慢一些。
这是因为binlog是在事务提交的之后一次性写入的导致的,这些可以借助测试验证。
4、什么时候释放
binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数以后,会被自动删除。
5、对应的物理文件
配置文件的模式为log_bin_basename,binlog日志文件根据选定大小,当日志文件超过指定的最大的大小然后,进行滚动升级,生成新的日志文件。
对于每个binlog日志文件日志分类学生,通过一个统一的index文件来组织。
6、其他
二进制日志的作用之一是还原的,这与redo log很类似,很混淆过,但是它们有本质的不同:
关于事务提交时,redo log和binlog的读取顺序,为了确保主从复制之后的主从一致(当然也包含使用binlog进行基于时间点还原的状况),是要严格一致的,
MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交失败(刷入磁盘),事务才算真正的完成。
四、总结
MySQL中,对于以下三种日志,每一种细化出来都可以够写一个章节的,这里简要地总结了一下三种日志的一些缺点和作用,以帮助理解MySQL中的事物或者事物背后的原理。
原文:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121726-1.html
mysql有多少种日志_MySQL到底有多少种日志类型必须我们记住的!相关推荐
- mysql general bin区别_MySQL中几种常见的日志
前言: 在 MySQL 系统中,有着诸多不同类型的日志.各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据.这些不同类型的日志有助于我们更清晰的了解数据库,在日 ...
- mysql主备模型_MySQL主从复制 - 基于二进制日志(理论篇)
mysql日志类型 1 二进制日志 2 事务日志 3 一般查询日志 4 中继日志 5 慢查询日志 二进制日志 二进制日志通常记录的是可能潜在引起数据库发生改变的操作,每一 ...
- 清理mysql慢查询日志_MySQL清理慢查询日志slow_log的方法
一.清除原因 因为之前打开了慢查询,导致此表越来越大达到47G,导致磁盘快被占满,使用xtrabackup进行备份的时候文件也超大. mysql> show variables like 'lo ...
- mysql的隔离级别_MySQL的四种事务隔离级别
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- mysql什么级别数据库_Mysql的四种隔离级别是什么
Mysql的四种隔离级别是什么 发布时间:2020-12-03 09:47:01 来源:亿速云 阅读:116 作者:小新 这篇文章给大家分享的是有关Mysql的四种隔离级别是什么的内容.小编觉得挺实用 ...
- MySQL支持的四种索引_Mysql常见四种索引的使用
提到mysql优化,索引优化是必不可少的.其中一种优化方式 --索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升. 我们知道项目性能的瓶颈主要是在"查(select)&q ...
- mysql的存储引擎_Mysql数据库3种存储引擎有什么区别?
展开全部 MySQL常见的三种存储e68a843231313335323631343130323136353331333366306561引擎为InnoDB.MyISAM和MEMORY.其区别体现在事 ...
- mysql update批量更新_MySql中4种批量更新的方法
mysql 批量更新共有以下四种办法 1..replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,' ...
- mysql 事务 隔离级别_MySQL的四种事务隔离级别
https://www.cnblogs.com/huanongying/p/7021555.html 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的 ...
最新文章
- python之celery简单使用
- php多图片上传并回显,如何用input标签和jquery实现多图片的上传和回显功能
- linux下安装mysql57_Linux——CentOS7之mysql5.7安装与配置
- DPM2012系列之十三:如何清理无法联系的客户端代理
- codeforces1472 G. Moving to the Capital
- endwith php,endwith函数怎么使用
- Fragment学习3--底部tab布局
- 如何在JavaScript中声明名称空间?
- awk命令的使用案列
- C++小白课本练习3
- python百度百科-python语言是由哪个人创造的
- [转] Spring XML配置十二个最佳实践
- 阿里云CentOS服务器搭建静态网站(零基础)
- 拆解一个老式电感电容表
- 张小龙2019微信公开课演讲实录
- 乱序整数序列两数之和绝对值最小
- [buuctf.reverse] 131-135
- 非监督分类ecognition_资管新规学习03资管产品的范围和分类
- 微信电脑版公测更新,终于可以刷朋友圈啦!!(附公测地址)
- Deepin linux安装五笔输入法
热门文章
- K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?
- linux shell合并文件命令paste
- waf旁路oracle客户端,WAF Bypass数据库特性(Oracle探索篇)
- 数据库优化(学习笔记)
- 分类与逻辑回归(classification and logistic regression)
- 序列拼接工具Bowtie使用说明
- linux进程间通讯-共享内存
- Python基础之标准库datetime 时间与日期的使用
- 【文本分类】混合CHI和MI的改进文本特征选择方法
- Java源码详解零:HashMap介绍