满满干货深入剖析MySQL中可能会忽视

白癜风早期有哪些症状 http://pf.39.net/bdfyy/bdfzg/190611/7208874.html

今日分享开始啦,请大家多多指教~

mysql基础

对于后端开发来说,打交道最多的应该是数据库了,因为你总得把东西存起来。

或是mongodb或者redis又或是mysql。然后你发现一个问题,就是他们都有日志系统,那么这些日志用来干什么的呢?

举两个例子,回滚和同步。

回滚,这里的回滚是比如说一条语句增加了1,然后再减一吗?这里的回滚操作并不是这样的。比如说我要更新一条语句,updatetestseta=1whereb=2,这样的语句,如果这条语句需要回滚,那么操作就应该是在执行前,先查询这条数据进行保存,如果执行完毕需要回滚,那么就直接把原来那条语句写回去。

又比如说,你的数据库要还原到一个小时前,那么你可以把2个小时前的备份拿出来,然后运行前两个小时到前一个小时的日志文件,那么这个时候就相当于回到了一个小时前了。

同步,比如说主从同步了,这样老生常谈的了,一般通过事务日志来同步。总之,有了日志,那么可以帮我们实现很多功能的了。

那么mysql在innodb引擎下,有两个日志非常重要,那就是redolog(重做日志)和binlog(归档日志)日志。

如果没有这两个日志,应该没啥人敢用mysql的了,因为这两个日志是用了保证mysql的数据完整性的,如果一个数据库连完整性都不能保证,那么是非常危险的。

redolog

首先看下redolog,这个是什么呢?这个是innodb存储引擎的日志。

说一个它的功能哈,前文提及到存储引擎就相当于我们操作系统的文件系统。

那么问题来了,我们的文件系统是有缓存的,比方说我们写入一个文件,当我们调用函数的时候,不会直接写入,而是写入缓存去,而后又文件系统自己判断啥时候应该写入进去。

判断什么时候应该写入进去:

其中有一个标准就是这次要写入缓存的时候,判断缓存是否能够装得下,如果装不下,那么先写入文件,清除缓存,然后再写入缓存。第二个判断标准就是根据时间某一段时间后进行写入。同样存储引擎也要为这一段事情操心啊。如果我们更新一条语句,存储引擎就直接给我们操作正在存储数据的地方,那效率可想而知。所以说,存储引擎就想到一个方法,把更新记录记录到redolog中,等redolog快写满,然后就操作到磁盘,或等空闲时间更新进去。

写完redolog之后,就会告诉执行器,执行完毕了。这个时候我们的应用程序得到更新成功的回调。

如果单纯只写入redolog是不行的,因为存储过程不仅要写,还要读啊,如果写完redolog通知我们的应用程序更新成功,这个时候还没写入到数据文件,那么我们的应用程序去读的时候就读到了旧的数据。

那么这个时候,存储引擎是这么干的。反正你给我查询的时候要先查询内存,内存中没有才去查询数据文件。那么存储引擎,先更新到内存中,然后更新到redolog。这样对于存储引擎外部来说,是更新了的,毕竟对于外部来说存储引擎是一个整体。

这就是MySQL里经常说到的WAL技术,WAL的全称是Write-AheadLogging。

那么这个redolog是一个什么样的机制呢?难道就一直记录到一个文件中,然后当要写入数据文件的时候,全部写入,然后删除?如果这么干效率自然是低了。redolog的机制是这样的。

redolog是由四个文件组成,每个文件大小为1G左右,这个都是可以设置的。

有两个参数,分别为checkpoint和writepos。

writepos是当前记录的位置。checkpoint是当前写入到数据文件的位置。比如说:

一开始的时候writepos写得了第二个文件的问题,如果为位置。

这个时候还没有去正在写入数据文件,那么这个时候checkpoint位置就是0。要往数据文件中写入数据的部分就是checkpoint到writepos这一段区间,也就是0-位置。

那么这个时候存储引擎感觉可以更新了,然后开始写入到正在的数据文件中,那么这个时候开始checkpoints开始往右移动,假设更新条。

那么就到了下面这个位置:

这个时候存储引擎感觉比较忙了,那么就更新条后,继续接执行器的任务,那么writepos往右继续移动。

那么这个时候就有一个问题出现,比如说文件大小不变,writepos一直往右移动,这样会超出啊。

那么这个时候writepos发现自己到了末尾,人家又从第一个开始写,覆盖写入。

如下:

绿色横线部分是要更新到数据文件的部分。

redolog还有一个重要的作用,保证数据正在地写入到数据文件中。

比如说这个时候正在写入数据文件,然后数据库异常重启了,这里理解异常重启,简单点理解就是内存都没了。那么我们知道写入文件是有缓存的,如果写入到一半异常了,那么数据其实是丢了的。

有了redolog之后,只有数据文件flush了,那么这个时候checkpoint才开始偏移,否则就如果异常了内存没了,那么继续覆盖更新,因为checkpoint没有变化,那么还是从原来那个异常前的位置开始同步。

那么问题来了,这时候就会想,数据文件是文件,redolog也是文件啊。如果写入的时候在缓存区,然后宕机这个时候也没了啊。

没错,的确有这个问题,这个时候为了数据安全,redolog直接不使用缓存区。

redolog用于保证crash-safe能力。innodb_flush_log_at_trx_


转载请注明:http://www.aierlanlan.com/grrz/1484.html

  • 上一篇文章:
  •   
  • 下一篇文章: