mysql undo MySQL中的undo日誌

2021-10-25 14:28:58 字數 1255 閱讀 5048

概念介紹:

我們知道,mysql中的redo日誌記錄了事務的行為,在伺服器宕機的時候,可以通過重做事務來達到恢復資料的目的,然而,有的時候,事務還有回滾的需求,也就是說,我們需要知道某條在變成當前情況之前的樣子,這種情況下,undo日誌就派上用場了。也就是說,undo日誌是為了將資料恢復到修改之前的樣子,因此在對資料庫進行修改的時候,我們需要知道,這個過程中會產生redo日誌和undo日誌。

儲存位置:

我們還知道,redo日誌一般情況下放在redo日誌檔案中,也就是常說的ib_log中,而undo日誌存放在資料庫內部的乙個"段"中,這個概念,我們在8月21號的文章中有講過,忘記的同學可以回去看看,undo日誌的段位於共享表空間內。

回滾操作:

現在,我們已經知道了undo的概念,其實就是共享表空間中的一塊區域,它的主要作用是將事務恢復到執行修改之前的樣子,但是,恢復的情況一般分為兩種,一種是邏輯恢復,一種是物理恢復,這裡需要非常強調的是,undo的恢復是邏輯恢復,也就是說,如果你插入了100w條資料,導致innodb分配了乙個新的資料頁來儲存這些資料,那麼在事務進行回滾的時候,undo的功能並不是**這個資料頁,而是將這些insert的操作,改變成delete的操作從而執行回滾。在這個過程中,共享表空間的大小並不會發生改變。除此之外,undo日誌會將delete操作轉化為insert操作,update操作轉化為反向的update操作。

刪除方式:

還有一點需要注意,事務共享表空間中寫入undo日誌的過程同樣需要寫入redo日誌,事務一旦提交,也就意味著事務的永續性生效,那麼undo日誌則不被需要,但是innodb並不會把這個undo日誌直接刪除,而是放在乙個undo日誌的鍊錶中,到底什麼時候刪除取決於mysql的purge執行緒,這樣做是為了避免其他的事務需要通過undo日誌來得到這條記錄之前的版本。

空間分配:

在實際操作中,乙個資料庫例項上可能會進行很多事務,如果我們為每乙個事務都分配單獨的日誌資料頁來儲存undo將會非常的浪費儲存空間,我們簡單算一算,假設乙個應用的tps為1000,為每個事務分配乙個undo頁,我們之後到乙個資料頁的大小是16kb,1分鐘將會產生60*1000個資料頁,那麼一分鐘大約需要的空間就是960m的磁碟空間,這樣顯然是不合理的,因此,在innodb中,對於undo頁可以進行重用,具體的方法是,事務提交的時候,現將undo頁放入鍊錶中,然後判斷這個undo頁的使用空間是否小於75%,如果是的話,那麼這個undo頁就可以被重用,之後的undo日誌就可以追加在當前undo日誌的後面。當然,我們可以通過show engine innodb status來檢視鍊錶中undo log 的數量,這裡不做演示了。

linux中 中括號 中的判斷引數

源自 http www.diybl.com course 6 system linux linuxjs 20081117 151774.html b file 若檔案存在且是乙個塊特殊檔案,則為真 c file 若檔案存在且是乙個字元特殊檔案,則為真 d file 若檔案存在且是乙個目錄,則為真 e...

從HIVE中中查詢

從hive資料庫查詢文件 by ymd 拼接sql語句 string sql select from doc file where contains name wildcard 拼接名稱查詢語句 if stringutils.isnoneempty unstructuredbean.getname ...

Spring中classpath中萬用字元號的使用

說明 無萬用字元,必須完全匹配 classpath user base beans.xml 說明 匹配零個或多個字串 只針對名稱,不匹配目錄分隔符等 例如 user a base beans.xml user b base beans.xml 但是不匹配 user base beans.xml cl...