innodb儲存引擎是以頁為單位來管理儲存空間的,我們進行的增刪改查操作都是將頁的資料載入到記憶體中,然後進行操作,再將資料刷回到硬碟上。
那麼問題就來了,如果我要給張三轉賬100塊錢,事務已經提交了,這個時候innodb把資料載入到記憶體中,這個時候還沒來得及刷入硬碟,突然停電了,資料庫崩了。重啟之後,發現我的錢沒有轉成功,這不是尷尬了嗎?
解決方法很明顯,我們在硬碟載入到記憶體之後,進行一系列操作,一頓操作猛如虎,還未重新整理到硬碟之前,先記錄下,在***位置我的記錄中金額減100,在***位置張三的記錄中金額加100,然後再進行增刪改查操作,最後刷入硬碟。如果未刷入硬碟,在重啟之後,先載入之前的記錄,那麼資料就回來了。
這個記錄就叫做重做日誌,即redo日誌。他的目的是想讓已經提交的事務對資料的修改是永久的,就算他重啟,資料也能恢復出來。
為了解決磁碟速度過慢的問題,redo日誌不能直接寫入磁碟,咱先整一大片連續的記憶體空間給他放資料。這一大片記憶體就叫做日誌緩衝區,即log buffer。到了合適的時候,再刷入硬碟。至於什麼時候是合適的,這個下一章節說。
我們可以通過show variables like 'innodb_log_buffer_size』命令來檢視當前的日誌快取大小,下圖為線上的大小。
由於redo日誌一直都是增長的,且記憶體空間有限,資料也不能一直待在快取中, 我們需要將其重新整理至硬碟上。
那什麼時候重新整理到硬碟呢?
log buffer空間不足。上面有指定緩衝區的記憶體大小,mysql認為日誌量已經佔了 總容量的一半左右,就需要將這些日誌重新整理到磁碟上。
事務提交時。我們使用redo日誌的目的就是將他未重新整理到磁碟的記錄儲存起來,防止 丟失,如果資料提交了,我們是可以不把資料提交到磁碟的,但為了保證永續性,必須 把修改這些頁面的redo日誌重新整理到磁碟。
後台執行緒不同的重新整理 後台有乙個執行緒,大概每秒都會將log buffer裡面的redo日誌重新整理到硬碟上。
checkpoint 下下小節講
我們可以通過show variables like 'datadir』命令找到相關目錄,底下有兩個檔案, 分別是ib_logfile0和ib_logfile1,如下圖所示。
我們將緩衝區log buffer裡面的redo日誌重新整理到這個兩個檔案裡面,他們寫入的方式 是迴圈寫入的,先寫ib_logfile0,再寫ib_logfile1,等ib_logfile1寫滿了,再寫ib_logfile0。 那這樣就會存在乙個問題,如果ib_logfile1寫滿了,再寫ib_logfile0,之前ib_logfile0的內容 不就被覆蓋而丟失了嗎? 這就是checkpoint的工作啦。
redo日誌是為了系統崩潰後恢復髒頁用的,如果這個髒頁可以被重新整理到磁碟上,那麼 他就可以功成身退,被覆蓋也就沒事啦。
衝突補習
從系統執行開始,就不斷的修改頁面,會不斷的生成redo日誌。redo日誌是不斷 遞增的,mysql為其取了乙個名字日誌序列號log sequence number,簡稱lsn。 他的初始化的值為8704,用來記錄當前一共生成了多少redo日誌。
redo日誌是先寫入log buffer,之後才會被重新整理到磁碟的redo日誌檔案。mysql為其 取了乙個名字flush_to_disk_lsn。用來說明快取區中有多少的髒頁資料被重新整理到磁碟上啦。 他的初始值和lsn一樣,後面的差距就有了。
做一次checkpoint分為兩步
計算當前系統可以被覆蓋的redo日誌對應的lsn最大值是多少。redo日誌可以被覆蓋, 意味著他對應的髒頁被重新整理到磁碟上,只要我們計算出當前系統中最早被修改的oldest_modification, 只要系統中lsn小於該節點的oldest_modification值磁碟的redo日誌都是可以被覆蓋的。
將lsn過程中的一些資料統計。
修改redo日誌大小
img 需求 由原來的每組50m增加到100m 1 檢視現在有日誌組資訊指令碼 select v logfile.member,v logfile.group v log.status,v log.archived,v log.bytes 1024 1024 v log.thread from v ...
mysql日誌系統 SQL 邏輯日誌 物理日誌
更新語句執行的流程和查詢語句執行的流程一樣 注意 在乙個表上有更新的操作的時候,和這個表相關的查詢快取就會被清空 在經歷分析器,優化器,和執行器儲存引擎的歷程中,還多了重要的日誌模組 redo log 重做日誌 bin log 歸檔日誌 是innodb 引擎獨有的日誌模組 它的關鍵點就是更新的時候先...
Oracle 調整重做日誌 redo 大小
oracle 調整重做日誌 redo 大小 需求描述 oracle 預設3個50m的redo日誌,對於大量tps的系統,會出現頻繁的日誌切換,影響系統效能 解決辦法 新增3個redo日誌,並將日誌大小調整為為1g 遺留問題 修改原有redo日誌時,會出現無法刪除的問題,需要等待日誌切換時,在嘗試。檢...