MySQL 日志记录

203 阅读6分钟

前言

最近自己在学习MySQL基础方面的知识,差不多学习的也有一周多的时间了,进度的话也不是很快。学习的收有个问题,学过的知识很快的就忘记了,这怎么得了,必须想个办法。

一开始是把看到的文章截图,觉得有用的地方截个屏发到微信上,有时间可以看一下,结果呢,你是知道的,肯定是没有看了,不仅没有看当天学习的知识,就连以前学习的也忘记的一干二净。

后来想到一个比较鸡贼的办法,抄比较优质的留言,把它们当做自己的学习心得,试过后感觉还可以,有些我不理解的地方,看了之后会有点起色,不想以前那么晦涩难懂了。这么骚操作之后,遇到一个新的问题,如果留言没有涉及到的内容我就不知道,比如每次课后习题我就不会做

我觉得自己在学习方法上有很大的问题,如果用一句话来总结,那就是,一看就会,一问旧懵。知识很大层面上还是停留在我知道这个层面,如果运用这些知识,把这些知识点用到工作生活中是不够的,我也知道一蹴而就的事情是不太可能办到的,学习是一件循序渐进的事。

这让我突然想到之前在学习数据结构的时候,每学习新的东西,我都会写一篇文章记录下来,学了什么,有什么感悟,记下来,这在以后回过头来看这些知识点会特别有感触,你会发现你容易就想到这些知识,这比你重新去看读书勾画的知识点要好一些,因为这是用你自己的话说出来的,有很大的不同

言归正传

说了这么多回到今天的主题内容,今天要回顾总结的知识点是MySQL日志系统,这块的内容如果要展开见是很复杂的,自己的能力也讲不了很深入,还是以学习教材为基础,在此基础上结合评论区比较优质的留言,来探讨这期学习内容,废话说的有点多了,我们现在正式开始

怎么说起这期的内容呢?是一个比较棘手的事情,单单拿出来讲觉得有点生硬,展开了讲又不会,真的很烦人,谁让你以前不好好读书的,这下惨了吧,后悔了吧

redo log(重做日志)

MySQL中的日志主要涉及到redo log 日志和binlog日志,稍后讲解binlog日志

在讲解redo log日志之前先问一个问题,为什么会有redo log日志呢?

在说为什么前,我先讲一个发生在我身上的事情,这个件事情大致是这样的。刚毕业那会儿我在一件天猫店铺上班,我主要负责的工作是打包快递,发快递,和快递公司对接,快递费用结算。每天快到下班前就有几家快递公司收快递,这些快递费用不是马上结清,每个月结算一次,但是每天产生的费用怎么结算呢,是那个本子急着嘛,不太可能,一开始我也不知道快递费用是多少,而是快递小哥根据收货地点,货物重量来结算的,一个月下来快递也有几千单,节假日有上万单,这可怎么好

那我是如何处理计算每天的快递费用的呢,并统计和快递公司月结一次。每个快递单我都会保留着,这上面不仅有收发信息,还有这件快递的费用,每到发完快递的时候,我都将所有的快递费用记录到excel表中,到了快月结快递费用的时候,就把上次结算到现在的快递算一下,总共好多单,好多费用。这样我不仅可以和快递公司结算账目,还可以回头查看每单的费用,即便快递公司这个月不结算费用,也可以在下个月结算

我说了这么多和redo log有什么关系嘛,有的,那就是MySQL每次产生的记录不会写入到磁盘中,而是先记录在redo log中,在不忙的时候再刷入到磁盘

如果每一次的更新操作都将写进磁盘,然后磁盘再找到那条记录进行过更新,整个I/O操作成本是很高的。为了避免频繁的I/O操作,将记录写入到日志,然后再持久化到磁盘,这就是预写式日志WAL,全称Write Ahead Logging

具体来说是这样的,当有一条记录需要更新的时候,InnoDB引擎会将记录写进redo log中,这条记录更新就算完成了,在系统比较空闲的时候InnoDB会把redo log中的记录存储到磁盘

那么Innodb是如何写把这条记录写入到redo log中的呢? 以及记录了什么到redo log中呢? 下面我们来一探究竟

在说怎么把记录写到redo log前,先说下redo log的一些特性,为后面的内容做铺垫,InnoDB 中的redo log是有固定大小,比如每个文件1GB,4个文件,共有4GB,如果4GB的空间沾满了就从头开始写,所以redo log也叫做重做日志, 写满了要把之前的记录存储到磁盘中

上图中的write pos表示的是当前记录的位置,一边写一边往后移动,写到3号文件末尾移到0号文件开头写。 checkpoint 是当前要查处的位置,也会一遍擦除记录一遍往后移动,擦除的记录要写进磁盘

如果write pos 追上了checkpoin表示redo log 写满了,这个时候需要停下来,擦除一些记录,把checkpoint推 进一下,擦除 的记录得写进数据文件

write pos 到3号文件末尾 ,以及0号文件开头到checkpoint这两部分是空闲的,可以用来写新的记录。

有了redo log ,即便数据库异常重启,也不会导致数据丢失,这些记录在redo log中,只要重启数据库这些记录就会存储到磁盘中,具有这样的能力称为crash-safe

redo log也叫做物理日志,记录的是在某个数据页上做了什么改动,会将redo log中的记录持久化到磁盘上。redo log上到底记录的是什么呢,具体我也不知道,可以先这么理解,redo log记录的是在某个数据页上做了什么修改

其实redo log往深入讲是很复杂的,我这里只说了redo log的皮毛,也只知道一点皮毛😁。有这种认识是很好的, 不想以前,觉得这个学了,我就懂了吧,我就不用在学习了哦,我真实太有才了,这种沙雕想法。

binlog (归档日志)