最近本身在學習MySQL基礎方面的知識,差很少學習的也有一週多的時間了,進度的話也不是很快。學習的收有個問題,學過的知識很快的就忘記了,這怎麼得了,必須想個辦法。數據庫
後來想到一個比較雞賊的辦法,抄比較優質的留言,把它們當作本身的學習心得,試事後感受還能夠,有些我不理解的地方,看了以後會有點轉機,不想之前那麼晦澀難懂了。這麼騷操做以後,遇到一個新的問題,若是留言沒有涉及到的內容我就不知道,好比每次課後習題我就不會作微信
我以爲本身在學習方法上有很大的問題,若是用一句話來總結,那就是,一看就會,一問舊懵。知識很大層面上仍是停留在我知道這個層面,若是運用這些知識,把這些知識點用到工做生活中是不夠的,我也知道一蹴而就的事情是不太可能辦到的,學習是一件按部就班的事。數據結構
說了這麼多回到今天的主題內容,今天要回顧總結的知識點是MySQL日誌系統,這塊的內容若是要展開見是很複雜的,本身的能力也講不了很深刻,仍是以學習教材爲基礎,在此基礎上結合評論區比較優質的留言,來探討這期學習內容,廢話說的有點多了,咱們如今正式開始學習
怎麼提及這期的內容呢?是一個比較棘手的事情,單單拿出來說以爲有點生硬,展開了講又不會,真的很煩人,誰讓你之前很差好讀書的,這下慘了吧,後悔了吧3d
MySQL中的日誌主要涉及到redo log 日誌和binlog日誌,稍後講解binlog日誌日誌
在講解redo log
日誌以前先問一個問題,爲何會有redo log
日誌呢?excel
在說爲何前,我先講一個發生在我身上的事情,這個件事情大體是這樣的。剛畢業那會兒我在一件天貓店鋪上班,我主要負責的工做是打包快遞,發快遞,和快遞公司對接,快遞費用結算。天天快到下班前就有幾家快遞公司收快遞,這些快遞費用不是立刻結清,每月結算一次,可是天天產生的費用怎麼結算呢,是那個本子急着嘛,不太可能,一開始我也不知道快遞費用是多少,而是快遞小哥根據收貨地點,貨物重量來結算的,一個月下來快遞也有幾千單,節假日有上萬單,這可怎麼好code
那我是如何處理計算天天的快遞費用的呢,並統計和快遞公司月結一次。每一個快遞單我都會保留着,這上面不只有收發信息,還有這件快遞的費用,每到發完快遞的時候,我都將全部的快遞費用記錄到excel表中,到了快月結快遞費用的時候,就把上次結算到如今的快遞算一下,總共好多單,好多費用。這樣我不只能夠和快遞公司結算帳目,還能夠回頭查看每單的費用,即使快遞公司這個月不結算費用,也能夠在下個月結算cdn
我說了這麼多和redo log有什麼關係嘛,有的,那就是MySQL每次產生的記錄不會寫入到磁盤中,而是先記錄在redo log中,在不忙的時候再刷入到磁盤blog
若是每一次的更新操做都將寫進磁盤,而後磁盤再找到那條記錄進行過更新,整個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
記錄的是在某個數據頁上作了什麼修改