SQLSERVER 事務日誌的 LSN 到底是什麼?

来源:https://www.cnblogs.com/huangxincheng/archive/2023/01/28/17069686.html
-Advertisement-
Play Games

一:背景 1. 講故事 大家都知道資料庫應用程式 它天生需要圍繞著數據文件打轉,諸如包含數據的 .mdf,事務日誌的 .ldf,很多時候深入瞭解這兩類文件的合成原理,差不多對資料庫就能理解一半了,關於 .mdf 的合成前面的文章已經有所介紹,這篇我們來聊一下 .ldf 的一些內部知識,比如 LSN。 ...


一:背景

1. 講故事

大家都知道資料庫應用程式 它天生需要圍繞著數據文件打轉,諸如包含數據的 .mdf,事務日誌的 .ldf,很多時候深入瞭解這兩類文件的合成原理,差不多對資料庫就能理解一半了,關於 .mdf 的合成前面的文章已經有所介紹,這篇我們來聊一下 .ldf 的一些內部知識,比如 LSN

二:對 LSN 的理解

1. 什麼是 LSN

如果大家玩過 SQLSERVER 的發佈訂閱或者 AlwaysOn 或多或少都見過 LSN,比如下麵的格式: 00000030:00018090:0002 ,這一串編號到底是什麼意思呢?本質上指示的是 .ldf 文件的某一個物理位置上的偏移,畫個圖大概如下:

從圖中可以看到其實是由 虛擬文件號:日誌段起始扇區編號:槽號編號 三部分組成,要瞭解這三部分就需要明白 .ldf 文件是如何進行邏輯劃分的,畫個簡圖如下:

通過上面的圖很容易就能明白其中的邏輯關係,事務日誌文件被劃分成了多個 虛擬文件,虛擬文件又劃分成了多個 日誌段,日誌段又劃分成了多個 扇區,日誌段中日誌記錄位置存儲在 槽號 中,有了這些理論基礎,接下來用一個案例來加深大家的理解吧。

2. 一個案例演示

新建一個 MyLSN 資料庫,再創建一個 test 表,插入 3w 條記錄,sql如下:


CREATE DATABASE MyLSN
GO
USE MyLSN
GO
CREATE TABLE test(a INT IDENTITY, b CHAR(10) DEFAULT 'aaaaaaaaaa')

SET NOCOUNT ON
INSERT INTO test (b) DEFAULT VALUES
GO 30000
SET NOCOUNT OFF

接下來通過 fn_dblog 來查詢和 dbo.test 表相關的事務日誌記錄。


SELECT [Current LSN],
       Operation,
       Context,
	   AllocUnitName,
       [RowLog Contents 0],
       [Log Record],
       [Log Record Length]
FROM fn_dblog(NULL, NULL)
WHERE AllocUnitName LIKE '%test%';

從圖中可以看到這是一個 INSERT 的事務日誌記錄,這裡就拿編號 00000030:00000db0:0002 去定位 .ldf 中的物理偏移位置吧,要想獲取物理偏移就要知道下麵偏移值才可以。

  1. 0x30 虛擬文件號的偏移值是多少 ?

要想知道這個信息,可以用 DBCC loginfo 命令,查看 FSeqNo下的 StartOffset 偏移值即可,即 0n48 對應的 4071424 ,截圖如下:

  1. 0xdb0 扇區號的偏移是多少?

大家都知道磁碟的扇區是 512byte,sqlserver 為了更好的寫入磁碟,也用了 512byte 這個粒度,所以偏移值就是 512 * 0xdb0

綜合上面就能定位到日誌段的物理偏移值為:


lkd> ?0n4071424 + (0n3504*0n512)
Evaluate expression: 5865472 = 00000000`00598000

接下來用 WinHex 來定位 MyLSN_log.ldf 文件偏移 00598000 的位置,定位之前先將資料庫離線。

ALTER DATABASE MyLSN SET OFFLINE

前面的 0x0003 表示該日誌段只有 3 條記錄,後面的 0x019E 表示該日誌段的大小為 414byte,接下來就是槽號了,槽號位置的物理偏移計算規則如下:


lkd> ? 00598000 + 019E - 1
Evaluate expression: 5865885 = 00000000`0059819d

從圖中可以看到,slot2 的偏移值為 00C8,即物理偏移值為 005980c8


lkd> ? 00598000 + 00C8
Evaluate expression: 5865672 = 00000000`005980c8

從上面框出的內容可以輕鬆的看到,事務日誌中記錄了 Insert 的 aaaaaaaaaa 值,太棒了,起始就是 fn_dblog 查出來的 Log Record 值。

三:總結

對 LSN 有一個深度的理解,對各種資料庫事務日誌暴漲的故障分析都會有一個很好的理論基礎,後面我們再聊這些話題。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前也用過一些緩存中間件,框架,也想著自己是不是也能用Java寫一個出來,於是就有了這個想法,打算在寫的過程中同步進行總結 源碼:https://github.com/weloe/Java-Distributed-Cache ...
  • 這篇文章主要描述RPC負載均衡和服務重試,負載均衡包括常用負載均衡類型、演算法、RPC自適應負載均衡設計方案,服務重試包括服務重試的原因以及如何在約定的時間內安全可靠的重試。 ...
  • 測試一、虛繼承與繼承的區別 1.1 單個繼承,不帶虛函數 1>class B size(8): 1> + 1> 0 | + (base class A) 1> 0 | | _ia //4B 1> | + 1> 4 | _ib //4B 有兩個int類型數據成員,占8B,基類邏輯存在前面 1.2、單個 ...
  • ​ 該專欄是為Linux內核開發編程做鋪墊,如果你對操作系統很熟悉,想瞭解一些Linux內核發開的知識,請直接跳轉至《Linux內核編程專欄》,如果你對Linux內核編程也很熟悉,想瞭解Linux內核的各個模塊,可移步至《Linux內核分析專欄》,帶你領略Linux內核的絕美風光。 ​ 操作系統導學 ...
  • Win11安裝VMware Workstation Pro,Centos,Xshell,Xftp(Linux學習需要) 註意:1.win11不能安裝太低版本的VMware Workstation Pro,否則啟動linux會出現藍屏 ​ 2.win11是預設沒有開虛擬機平臺支持的,所以同時也要開啟, ...
  • 前言 本篇我將介紹 Keil C51 和 MDK-ARM 兩大集成開發環境的安裝包下載方法,幫助大家安全快速的從官網下載安裝包。 博主編寫了軟體安裝教程,可以在安裝包下載完成後,跳轉觀看圖文教程進行軟體的安裝與註冊。 待更新 Keil 官網 Keil 官網 >> 點擊跳轉 Keil C51 官網下載 ...
  • 痞子衡單片機排行榜(2022Q4) 繼2020年開辦的《痞子衡嵌入式半月刊》之後,從2023年1月份開始痞子衡將為大家帶來新項目《痞子衡單片機排行榜》(一年分四季,每個季度發佈一期),以MCU主頻和Coremark跑分為基礎(後期會加入更多指標),搜羅國內外8051/ARM/RISC-V等不同賽道的 ...
  • 固件更新 需將小米AX9000路由支持安裝Docker,但正式版並沒有該功能需更新為開發板Rom,直接在小米路由官網下載固件更新即可,當前正式版最新固件為1.0.165,開發板固件為:1.0.140; 固件更新為140開發版本後即可在小米路由管理頁面的高級設置項中看到DOCKER的選項; 安裝Doc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...