前言
最近自己在学习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记录的是在某个数据页上做了什么修改