《《MySQL運維內參》節選》要點:
本文介紹了《MySQL運維內參》節選,希望對您有用。如果有疑問,可以聯系我們。
本文上接第二部分,本機講述REDO日志.
REDO LOG是用來做數據庫crash recovery的,這是數據庫保障數據安全的重要功能之一.在數據庫操作中,它保存了對InnoDB表中數據的修改記錄,所以也叫日志文件.在InnoDB存儲引擎中,一般默認包括2個日志文件,新建數據庫之后,會有名為ib_logfile0和ib_logfile1的兩個文件,如果在啟動數據庫時,這兩個文件不存在,則InnoDB會根據配置參數或默認值,重新創建日志文件.
在InnoDB內部的日志管理中,一個很重要的概念是LSN,全名叫Log Sequence
Number,它用來精確記錄日志位置信息,且是連續增長的.在InnoDB中,大小為8個字節的值,它的增長量是根據一個MTR(mini-transaction,后面會講到)寫入的日志量來計算的,寫多少日志(單位字節),LSN就增長多少.日志文件輪循一圈(所有日志文件是以循環方式使用的),那么LSN的增長量大約就是整個日志文件的大小(日志文件存在文件頭等會占用一部分空間).它是一個集邏輯意義與物理意義于一身的概念.而在有些數據庫中,LSN是一個完全邏輯的概念,每提交一個物理事務,LSN就加1.
上面提到,日志文件是以類似循環圈的方式使用的,如下圖所示.
在InnoDB中,通過日志組來管理日志文件,是一個邏輯定義,包含若干個日志文件,一個組中的日志文件大小相等,大小通過參數來設置.現在InnoDB只?持一個日志組.在MySQL 5.5及之前的版本中,整個日志組的容量不能大于4G(實際上是3.9G多,因為還有一些文件頭信息等),到了MySQL5.6.3版本之后,整個日志組的容量可以設置得很大,最大可以達到512G.
REDO日志的寫入,都是字節連續的,雖然看上去是多個日志文件,但理解的時候,完全可以把它想象成一個文件,對每一文件掐頭去尾,把剩下的空間連接起來,就是總的日志空間了.
日志組中的每一個日志文件,都有自己的格式,內部也是按照大小相等的頁面切割,但這里的頁面大小是512個字節,由于歷史的原因,考慮到機械硬盤的塊大小是512字節,日志塊大小也如此設計.這是因為寫日志其實就是為了提高數據庫寫入吞吐量,如果每次寫入是磁盤塊大小的倍數,效率才是最高的,并且日志將邏輯事務對數據庫的分散隨機寫入轉化成了順序的512字節整數倍數據的寫入,這樣就大大提高了數據庫的效率.正是因為這個原因,REDO日志才可以說是數據庫管理系統與通過直接寫文件來管理數據的最根本的區別之一.
下面展示的是日志文件的格式.
注:圖中第一列指的是每一項在頁面中的偏移位置,而下一項則是這個值再加上該值在頁面中所占長度的值
上面的4個頁面(2048字節),就是圖中展示的內容,主要用于管理日志內容及整個數據庫狀態.在這2K內容之后,就是正常的用來存儲日志內容的部分,也是按照512字節頁面大小的方式存儲,下圖中展示的是正常日志頁面的格式.
普通頁面中,都會有12個字節用來存儲頁面頭信息,這些信息主要用于管理這個頁面本身的數據存儲方式.
上面所講述的就是日志文件的組織結構,只有前面2K是日志頭,后面所有的都是一個個連續的、用來存儲MTR產生的日志頁面.
什么是MTR InnoDB物理事務?
本文已經夠長了,且聽下回分解吧.
文章來自微信公眾號:DBAce
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4186.html