久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何解讀MySQL的InnoDB引擎日志工作原理

146次閱讀
沒有評論

共計 2373 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章主要介紹了如何解讀 MySQL 的 InnoDB 引擎日志工作原理,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

當你使用 UPDATE, INSERT, DELETE 語句更新數據的時候,你就改變了兩個地方的數據:log buffer 和 data buffers。Buffers 是固定長度的內存塊,通常是 512 字節。

LOG BUFFER           DATA BUFFER
=================    ===============
= Log Record #1 =    = Page Header =
= Log Record #2 =    = Data Row    =
= Log Record #3 =    = Data Row    =
= Log Record #4 =    = Data Row    =
=================    =============== 例如:INSERT INTO JOBS VALUES(1,2,3) 語句執行之后,log buffer 將增加一個新的 log 記錄,稱為 Log Record #5,它包含一個 rowid 和新記錄的內容。同時,data buffer 也將增加一個新行,但是,它會同時在頁頭標識:該頁最新的 log 記錄是 Log Record #5。在這個例子中 #5 是 Log Sequence Number(LSN),它對于接下來操作的時序安排是至關重要的。

[@more@]

下面是 data-change 的一些細節:

1.         一個 INSERT log 記錄僅包含一個新數據,它對于在頁上重做操作是足夠的了,因此被稱為一個 redo 條目。

2.         LSN 不是 log 記錄的一個域,它是文件中的一個絕對地址的相對偏移值。

在 InnoDB 改變了 log buffer 和 data buffer 之后,接下來就是寫盤了。這就是復雜的地方。有多個線程在監控 buffer 的活動情況,有三種情況――overflow,checkpoint 和 commit――可以導致寫盤操作。

Overflows 情況下發生了什么?

Overflow 是很少發生的情況,因為 InnoDB 采用 pro-active 措施來防止 buffers 被填滿。但是我們還是來看看下面兩種情況:

1.         如果 log buffer 滿了,InnoDBInnoDB 在 buffer 的末尾寫 log。那么情況向下面的圖一樣(log buffer 只有四條記錄的空間,現在插入第五條記錄):

LOG FILE(S) BEFORE WRITING LOG RECORD #5
=================
= Log Record #1 =
= Log Record #2 =
= Log Record #3 =
= Log Record #4 =
=================

LOG FILE(S) AFTER WRITING LOG RECORD #5
=================
= Log Record #5 =
= Log Record #2 =
= Log Record #3 =
= Log Record #4 =
=================logs 不可能永遠增長。即使 InnoDB 使用了某些壓縮算法,log 文件還是會由于太大而不能放到任何磁盤驅動器上。因此 InnoDB 采取循環寫的辦法,也就是說將會覆蓋前面就的 log 記錄。

2.         如果 data buffer 滿了,InnoDB 將最近使用的 buffer 寫入到數據庫中,但是不可能足夠的快。這種情況下,頁頭的 LSN 就起作用了。第一,InnoDB 檢查它的 LSN 是否比 log 文件中最近的 log 記錄的 LSN 大,只有當 log 趕上了 data 的時候,才會將數據寫到磁盤。換句話說,數據頁不會寫盤,直到相應的 log 記錄需要寫盤的時候。這就是先寫日志策略。

CheckPoints 的時候發生了什么?

前面說過 InnoDB 采取了一些 pro-active 措施來保證不發生 overflows,其中最重要的措施就是 checkpointing。有一個分離的線程,或者說從一組修改 buffers 的線程中分離出來的一個線程。在特定的時間間隔,checkpointer 將醒來,檢查 buffer 的改變,并保證寫盤操作已經發生了。

大部分 DBMS 在這個時候,將會把所有的 buffer 寫盤,這樣可以保證所有改變了但是沒寫盤的 buffer 都寫盤。就是說 DBMS 將通過”Sharp Checkpoint”flush 所有”dirty”buffers。但是 InnoDB 只保證:(a)log 和 data buffers 不會超過某個限制點;(b)log 始終比 data 先寫盤;(c)沒有哪個 data buffer 的頁頭 LSN 等于被覆蓋寫的 log 記錄。也就是說 InnoDB 是”Fuzzy Checkpoint”。

在 COMMIT 的時候,InnoDB 不會將 dirty data page 寫盤。之所以強調這個是因為,很容易讓人想到,提交改變就是將所有東西寫到一個持久媒介上。其實,只有 log 記錄需要寫。寫 dirty data page 只可能發生在 overflow 或 checkpoint 時刻,因為它們的內容是多余的。

Recovery

在 recovery 里面可以看到 log 是非常必要的:當數據庫發生異常的時候,數據是可以恢復的。

對于不是損壞磁盤驅動器的異常,恢復是自動進行的。InnoDB 讀取最新的 checkpoint 日志記錄,檢查 dirty pages 是否在異常發生前寫到磁盤上了,如果沒有,則讀取影響該頁的 log 記錄并應用它們。這被稱為”rolling forward”。因為有 LSN,所以 InnoDB 只需要比較這個數字就可以進行同步。

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“如何解讀 MySQL 的 InnoDB 引擎日志工作原理”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計2373字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 滨海县| 清水河县| 西盟| 苍溪县| 昌邑市| 左云县| 昌平区| 万载县| 五华县| 甘洛县| 高要市| 武隆县| 鱼台县| 霞浦县| 西丰县| 县级市| 安阳市| 库尔勒市| 如东县| 洛南县| 临西县| 眉山市| 沿河| 南投市| 方山县| 开封县| 汤阴县| 石门县| 灵台县| 霍林郭勒市| 木里| 富蕴县| 延长县| 华阴市| 南平市| 北票市| 桂东县| 方正县| 石柱| 文登市| 安远县|