CLFS 記錄序號
在 Common Log File System (CLFS) 中,指定資料流程中的每個記錄檔記錄都會由記錄序號 (LSN) 唯一識別。 當您將記錄寫入資料流程時,會傳回 LSN 來識別該記錄以供日後參考。
為特定資料流程建立的 LSN 會形成嚴格增加的序列。 也就是說,指派給指定資料流程中記錄檔記錄的 LSN 一律大於指派給先前寫入該相同資料流程之記錄檔記錄的 LSN。 下列函式可用來比較指定資料流程中的記錄記錄 LSN。
常數CLFS_LSN_Null和CLFS_LSN_INVALID是所有有效 LSN 的下限和上限。 任何有效的 LSN 大於或等於CLFS_LSN_Null。 此外,任何有效的 LSN 都嚴格小於 CLFS_LSN_INVALID。 請注意,CLFS_LSN_Null是有效的 LSN,而 CLFS_LSN_INVALID 不是有效的 LSN。 即使如此,您也可以使用上一個清單中的函式,比較CLFS_LSN_INVALID與其他 LSN。
針對每個資料流程,CLFS 會持續追蹤兩個特殊的 LSN:基底 LSN 和最後一個 LSN。 此外,每個個別記錄檔記錄都有兩個特殊的 LSN (先前的 LSN 和復原下一個 LSN) ,可用來建立相關記錄檔記錄的鏈結。 下列各節將詳細說明這些特殊的 LSN。
基底 LSN
當用戶端寫入資料流程中的第一筆記錄時,CLFS 會將基底 LSN 設定為該第一筆記錄的 LSN。 基底 LSN 會保持不變,直到用戶端變更為止。 當資料流程的用戶端不再需要資料流程中特定點之前的記錄時,他們可以呼叫 ClfsAdvanceLogBase 或 ClfsWriteRestartArea來更新基底 LSN。 例如,如果用戶端不再需要前五筆記錄,則可以將基底 LSN 設定為第六筆記錄的 LSN。
[最後一個 LSN]
當用戶端將記錄寫入資料流程時,CLFS 會調整最後一個 LSN,使其一律是最後一筆記錄的 LSN。 如果用戶端在資料流程中的特定點之後不再需要記錄,他們可以呼叫 ClfsSetEndOfLog來更新最後一個 LSN。 例如,如果用戶端不再需要第十筆記錄之後寫入的任何記錄,則可以將最後一個 LSN 設定為第十筆記錄的 LSN 來截斷資料流程。
資料流程的作用中部分
資料流程的作用中 部分 是從基底 LSN 所指向的記錄開始的資料流程部分,並以最後 LSN 所指向的記錄結尾。 下圖說明基底 LSN 和最後一個 LSN 如何描述資料流程的作用中部分。
注意 如果資料流程有封存結尾,則資料流程的作用中部分會從基底 LSN 或封存結尾指向的記錄開始,以較小的方式開始。 如需封存的詳細資訊,請參閱 封存的 CLFS 支援。
上一個 LSN
假設兩個作用中的資料庫交易 (交易 A 和交易 B) 同時將記錄寫入相同的資料流程。 每次交易 A 寫入記錄時,都會將記錄的上一個 LSN 設定為交易 A 所寫入記錄檔記錄的 LSN。這形成屬於交易 A 的記錄鏈結,可依反向順序周遊。 鏈結會以交易 A 寫入的第一筆記錄檔記錄結束,其先前的 LSN 設定為 CLFS_LSN_INVALID。 同樣地,交易 B 會藉由設定其寫入之每個記錄檔記錄的先前 LSN 來建立自己的記錄檔記錄鏈結。
下圖中的箭號說明記錄記錄先前的 LSN 如何指向屬於特定交易之鏈結中的上一筆記錄。
復原下一個 LSN
假設交易會對變動性記憶體中的資料物件進行五次更新、回復第四次和第五次更新,然後進行第六次更新。 當交易進行更新時,它會寫入記錄 1、2、3、4、5、5'、4'和 6。 記錄檔記錄 1 到 5 描述更新 1 到 5 所做的變更。 記錄 5' 描述在更新 5 復原期間所做的變更,而記錄 4' 描述在更新 4 復原期間所做的變更。 最後,記錄 6 描述更新 6 所做的變更。 請注意,數位 1、2、3、4、5、5'、4'和 6 不是記錄檔記錄的 LSN;它們只是用來命名記錄檔記錄的數位,以供此討論之用。
描述復原的記錄檔記錄 5' 和 4',稱為補償記錄 (CLR) 。 交易會將每個 CLR 的復原下一個 LSN 設定為先前 (記錄檔記錄) 所寫入之記錄檔記錄的復原下一個 LSN,而該記錄檔記錄只會復原 (復原) 。 在此範例中,記錄 5' 的復原下一個 LSN 是記錄 4 的 LSN,而記錄 4' 的復原下一個 LSN 是記錄 3 的 LSN。
) 不是 CLR 的一般記錄檔記錄 (,其復原下一個 LSN 會設定為交易所寫入的先前記錄檔記錄。 也就是說,針對一般記錄,復原的下一個 LSN 和先前的 LSN 相同。
現在假設系統失敗,而且在重新開機復原期間,必須復原整個交易。 復原程式碼會讀取記錄 6。 記錄 6 中的資料表示記錄 6 是一般記錄, (不是 CLR) ,因此復原程式碼會復原更新 6。 然後,復原程式碼會檢查記錄 6 的復原下一個 LSN,併發現它指向記錄 4'。 記錄 4' 中的資料表示它是 CLR,因此復原程式碼不會回復更新 4'。 相反地,它會檢查記錄 4' 的復原下一個 LSN,併發現它指向記錄 3。 記錄 3 不是 CLR,因此復原程式碼會復原更新 3。 更新 5 和 4 不會在復原期間復原,因為它們已在一般轉送處理期間回復。 最後,復原程式碼會回復更新 2 和 1。
下圖中的箭號說明復原下一個 LSN 如何提供一種機制,讓復原程式碼可用來略過更新已回復的記錄。