SQL Server的實例恢復解析

来源:http://www.cnblogs.com/leohahah/archive/2017/06/10/6979670.html
-Advertisement-
Play Games

同Oracle一樣,SQL Server在非一致性關閉的時候也會進行實例恢復(Instance Recovery),本文根據stack overflow的文章介紹一些SQL Server實例恢復的知識。 原文鏈接:https://stackoverflow.com/questions/4193273 ...


同Oracle一樣,SQL Server在非一致性關閉的時候也會進行實例恢復(Instance Recovery),本文根據stack overflow的文章介紹一些SQL Server實例恢復的知識。

原文鏈接:https://stackoverflow.com/questions/41932735/sql-server-instance-recovery

關於Oracle的實例恢復參考之前的博文:http://www.cnblogs.com/leohahah/p/6973600.html

首先看一下SQL Server中事務日誌的作用:

在SQL Server資料庫中,事務日誌用於記錄事務在Buffer Cache中的做的頁更改。

當我們更新一些數據時,資料庫會把相關數據頁的前鏡像和後鏡像都記錄在事務日誌中,併為每個事務生成一個唯一的LSN(log seq number),在檢查點發生時SQL Server確保檢查點LSN之前的臟塊被全部寫入到磁碟。因此SQL Server的事務日誌兼有redo和undo的作用。

但是,如果我們的資料庫被強制關閉或者伺服器異常掉電重啟,資料庫就將處於非一致性的狀態(沒業務的庫除外),這意味檢查點之後的所有事務(無論是提交還是未提交的),都出現了異常,提交的事務可能臟塊未被寫入磁碟,未提交的長事務可能有一部分臟塊已經被寫入到磁碟,資料庫必須處於一致狀態才能被正常打開,因此此時必須進行實例恢復

SQL Server的實例恢復分兩個階段:

1.前滾

此階段只處理已提交的事務,根據boot page中記錄的檢查點和事務日誌的記載,SQL Server重構檢查點之後的記憶體臟塊並按正常機制提交已提交事務的臟塊。

對未提交事務的臟塊暫時不做操作。

2.回滾

此階段處理未提交的事務,SQL Server根據事務日誌中記載的更改塊前鏡像,去覆蓋硬碟上那些未提交事務涉及的數據塊。

總結一下:

1)實例恢復的目的:

  • 將所有已提交事務的臟塊寫入磁碟。
  • 回滾未提交的事務。
  • 將檢查點推進至已被寫入磁碟的事務LSN。

2)實例崩潰之前:

  • 一些已提交的事務被事務日誌記錄,但是臟塊未被寫入到磁碟
  • 一些未提交的長事務中的臟塊已經被寫入到磁碟
  • 一些未提交的事務,其日誌還留在log buffer中未被寫入到磁碟中的事務日誌文件。

3)實例恢復階段:

  • Log buffer中所有未提交事務的日誌在掉電時全部被清空。(已提交事務的日誌預設被寫入了磁碟事務日誌文件)
  • 從boot page中識別出上一個檢查點,作為實例恢復的起點。
  • 在前滾階段,SQL Server根據事務日誌的記錄對所有臟塊進行重現。(無論是提交還是未提交的事務)然後將已提交事務的臟塊寫入磁碟,對未提交事務的臟塊暫不作操作。
  • 在回滾階段,SQL Server根據事務日誌中記載的前鏡像對所有未提交的事務進行回滾。
  • 更新boot page中的檢查點LSN和事務日誌中的LSN。

在以上的介紹中我們提到了boot page,那麼什麼是boot page呢?

每個資料庫都會有一個記錄資料庫重要信息的頁,只有一頁一般是 PRIMARY filegroup的第9個頁。我們可以使用如下命令查看這一頁的信息:

DBCC TRACEON (3604);
go
DBCC PAGE ('test',1,9,0)
go
關於DBCC PAGE的用法這裡解釋一下:
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
The printopt parameter has the following meanings:
0 - print just the page header
1 - page header plus per-row hex dumps and a dump of the page slot array (unless its a page that doesn't have one, like allocation bitmaps)
2 - page header plus whole page hex dump
3 - page header plus detailed per-row interpretation

檢查點LSN被記錄在boot page中,這是實例恢復的起點,如果這個page無法被訪問,那麼資料庫就不能被附加,打開,或者做其他任何操作。檢查點LSN只會被記錄在bootpage中,因此這是一個對於實例恢復來說不可或缺的頁。

對於SQL Server中檢查點的解釋:

當檢查點發生時,無論這個檢查點是如何觸發的(手動執行檢查點命令,或者資料庫執行差異差異備份,或者資料庫自動生成的檢查點),資料庫都會做以下操作:

  • 所有的臟塊都被寫入磁碟,無論事務是否已提交。
  • 在這些臟塊被寫入磁碟之前,所有關於這些臟塊更改的事務日誌也要被從log buffer中寫入到磁碟,這樣可以確保實例恢復的有效性和有序性,這個操作被稱作write-ahead logging(日誌先寫),日誌被寫入硬碟的操作是嚴格按時間序列化的,不可能以事務為單位來離散的寫入到磁碟,因此某個臟塊的寫入磁碟操作,可能引發log buffer中一些之前的、與本臟塊無關的事務日誌也被寫入磁碟。但這是有好處的,事務日誌總是被越早寫入磁碟越好。
  • 檢查點的LSN會被記錄到資料庫boot page中的dbi_checkptLSN區域。
  這裡可以複習一些Oracle的檢查點機制,也是CKPT進程觸發DBWR寫臟塊,同時如果要寫的臟塊的scn大於LGWR的scn,DBWR也會觸發LGWR把要寫的臟塊的相關log buffer寫入redo文件中,與SQL Server日誌先寫的機制相似。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OkHttp介紹 Android系統提供了兩種HTTP通信類,HttpURLConnection和HttpClient,HttpURLConnection相對來說比HttpClient難用,google自從2.3版本之後一直推薦使用HttpURLConnection,並且在6.0版本的sdk中直接刪 ...
  • 在iOS開發裡面我們經常會進行NSMutable(可變類型的類,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData等)屬性的聲明,在聲明時我們都知道要使用strong(強引用)來進行標識,但是很多人不知道為什麼不能 ...
  • 1。不要充滿至 100% 。 2。不要放電至 0% 。 3。電池的容量儘量維持在 50%。 4。不要在高溫下操作。 5。不要使用快充功能的充電器。 6。使用一般的充電器,如,500mA 或是 800mA。 ...
  • 本文想要完成對twemproxy發送流程——msg_send的探索,對於twemproxy發送流程的數據結構已經在《twemproxy接收流程探索——剖析twemproxy代碼正編》介紹過了,msg_send和msg_recv的流程大致類似。請在閱讀代碼時,查看註釋,英文註釋是作者對它的代碼的註解, ...
  • 登錄到安裝oracle資料庫伺服器的操作系統。打開命令視窗:(我的演示機器是windows) 登錄到安裝oracle資料庫伺服器的操作系統。打開命令視窗:(我的演示機器是windows) 查看環境變數ORACLE_SID的設置情況: windows: echo %ORACLE_SID% linux: ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一個SQL Server伺服器響應極度緩慢,並且出現客戶端請求報錯的情況,在資料庫中的errorlog中出現磁碟請求超過15s才完成的error消息。對於此類問題,到底是存儲系統或者磁碟的故障, ...
  • 1、基本構成 (1)需要查詢的表(單表,多表,視圖) (2)需要查詢的信息(欄位信息,過濾處理) (3)查詢條件(欄位關聯,欄位值範圍,記錄截取設置,排序方式,分組方式,去重,or ,and) 2、實例展示(以user表為例) 2.1查詢單表(user) (1)查詢單表所有欄位 select * f ...
  • 下載apache-flume-1.7.0-bin.tar.gz,用 解壓,在/etc/profile文件中增加設置: 修改$FLUME_HOME/conf/下的兩個文件,在flume-env.sh中增加JAVA_HOME: 最重要的,修改flume-conf.properties文件: 以上文件設置 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...