mysql 入门redolo binlog undolog

redolog

MySQL 里经常说到的 WAL 技术,意思就是数据先写日志,再写磁盘。这里面的日志就是innodb里面的redolog.当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写redo log里面,并更新内存,这个时候更新就算完了,然后innodb引擎会在适当的时候将数据跟新到磁盘里面,这个跟新会在系统空闲的时候进行。

这个可以加速的原因是不用去索引磁盘里面的数据,直接添加到日志里面,等到最后清算,如此可以有效提高效率。

redolog是个循环日志,其大小固定为4g,存在2个指正来定位其是否已经满了。一个指正是当前读,一个指针是当前写,很类似java里面的bytebuffer。redolog本质上就是为了崩溃恢复用的。当内存的数据页要持久化到磁盘,这个脏页的操作和redolog无关。只有当崩溃恢复的时候才用,把数据修复为脏页数据。因为redolog记录的是数据页的变换信息。 redolog只是个保险。数据页只存在2个情况。内存中,那就一定是正确的结果,直接返回,另一种是数据文件上的,那就一定正确,读入内存后返回。

binlog

这个是mysql自身的日志,叫做归档日志。和redolog大致3个不同点。

1.其为mysql自带的,redolog是innodb里面的。

2.redolog是物理日志,binlog是逻辑日志。

3.redolog是循环日志,binlog是增量日志。

对于我们来说,redolog主要针对系统崩溃,而binlog主要是针对系统恢复归档,因为redolog是循环的,无法持久太多。

undolog

扫描二维码关注公众号,回复: 6549399 查看本文章

这个日志主要用来处理事务的隔离级别的

详细信息请看我的另一篇文章,关于mysql innodb的隔离级别的实现。因此我在这里说下长事务对其的影响,我们知道我那篇文章说了,innodb是基于mvcc的控制,undolog将会非常的大,因为这个日志的大小和最早事务相关,因此长事务会使其的undolog非常大。

大家也不想使用长事务,但是以下情况可能出现长事务。就是你

set autocommit=0那就是不自动提交,即使是一个select语句那也不会提交,因此我们要注意。

我们用这条语句来判断事务是否为长事务。

select * from informationschema.innodbtrx where TIMETOSEC(timediff(now(),trx_started))>60

change buffer

这个东西主要是更新插入数据时用的哈,首先判断要更新的数据是否在内存,若在,直接更新内存,如不在,则是将其修改加入到change buffer里面,等到要查询这个数据的时候,再将其同步过去。或者等到一定时间通过定时器刷新过去。但是要用到这个东西不能加唯一索引,因为你加了唯一索引,那么就必须从磁盘读取到这个数据页来进行判断这个数据是否满足规范,因此要想用到这个change buffer就不能用唯一索引,只能用普通索引。那么这个change buffer和redo log的区别呢?在数据库的操作流程是这样的。假设这个数据不在内存里面,我们的操作流程是先写到change buffer里面,在写到redolog里面,当我们要读取这个数据的时候,我们从数据库里面读取到这个数据页,然后取出对应数据加上change buffer的东西。

因此相对于redolog,change buffer主要是减少了随机读取的性能消耗,因为我们不用读取这个数据页,插入更新的时候,只有当我们真正需要读取数据的时候才进行读取数据。而redolog则是有效减少了随机写磁盘的消耗,我们只用顺序写到redolog里面,当到一定时间后则刷新到数据库磁盘里面。完美。ps:这都是针对2级索引,而主键索引是判断数据所在数据页的在哪的,因此考虑了其唯一性。

这么说吧,redolog 考虑的主要是大量的写的到来,直接顺序的写到redolog里面速度快且持久化过,有保证,其实这个数据页如果在内存里面,以后查询直接读取,如果不在且上面的写没有唯一索引时(没有唯一索引,那就把数据修改加到changbuff里面,在写入redolog,减少读取数据到内存的麻烦)那就把数据页读取出来,和changgbuffer来个merge。当内存不够时,需要把一部分磁盘页刷新到磁盘。完成持久化哦。同时当redolog满了时,也会把一部分内存数据页刷新到磁盘。而刷数据页到磁盘,会导致mysql系统卡顿。

2阶段提交

redolog,binlog保持强一致性。一起成功,或者一起失败。不然可能导致数据出现问题。

一个更新语句的执行过程

1.先判断该数据对应的数据页是否在内存里面,如是在,则取出对应数据,若是不在,则从磁盘取出该数据页放入内存,并取出该数据。

2.修改该数据,且将其更新到内存。

3.将其修改更新到redolog里面。且置状态为prepare。

4.写入binlog,且将状态改为commit.

mysql 系统抖动

1.对于mysql来说,有时候你更新数据很快,有时候会很慢,很慢的时候就是发生了redolog写入磁盘的过程,对于mysql来说,我们的数据要么在内存,要么在磁盘,如果不在磁盘的数据,那么内存的数据是最新的,如果不在内存,那么磁盘的数据是最新的。为什么呢?因为,在redolog写磁盘的一个场景中。当读取量很大的时候,内存不够了,那么我们必须在内存里面淘汰一些数据页。当淘汰的数据页里面,存在脏页(内存和磁盘不匹配)在这种情况下,我们要淘汰磁盘页的同时,把redolog的数据页怼进磁盘里面。以下情况也会使得redolog写数据到磁盘里面。1redolog满了。2系统空闲。3.系统正常关闭。主要分析下,内存不够的情况。对于获取新的数据页,淘汰旧的数据页,我们如果淘汰的全部是脏页,那么性能消耗会大很多,因此我们要保证数据库脏页的比例。

innodbiocapacity,我们通过这个参数去设定。我们通过你的磁盘读写能力来设定这个值的大小。如果设定很低,那么mysql就会默认你的系统很差,如果很高,反之。。。我们系统默认的脏页比例是0.75,我们要控制器脏页比例不能太高。mysql还有一个连坐机制,当发现刷的脏页,旁边也是脏页,那么也会连带清除掉。这对于机械硬盘来说是很大的优化,但是对于ssd来说确实非必要的。

ps:因此当读取数据时,要么从内存里面读取,要么从磁盘读取。

  大连治疗阳痿早泄医院 mobile.84211111.net

  大连治疗早泄医院 mobile.84211111.net

猜你喜欢

转载自blog.csdn.net/qq_42894764/article/details/92831695