SQL Server在停止服務時會做CheckPoint嗎?

恭賀新禧,2016春節就用這一篇文來開工吧 ! ! ! !

很久之前有問過SQL五虎的楊志強老師一個問題,就是在搬移mdf及ldf到另一台SQL Instance時需要做什麼前置動作嗎?

當時楊老師提到先做CheckPoint來減少屆時Attach到另一台SQL時的ReDo及UnDo時間。當時我問老師SQL在停止服務時不會自動做CheckPoint嗎?這一篇我們就來LAB一下看看SQL在停止服務前會先做CheckPoint的動作嗎?

我利用下述的Code先建立一個資料庫DB及資料表TB1,然後寫入一筆資料後先做一次CheckPoint,然後再寫入第二筆資料後就關閉SQL服務。

Create Database [DB]
GO
Use [DB]
GO
Create Table [TB1](id int,name Char(4))
GO
Insert Into [TB1] Values(1,'Rock')
GO
CheckPoint /** 先做一次CheckPoint將上述資料寫入mdf **/
GO
Insert Into [TB1] Values(2,'Ray') /** 再寫入一筆資料 **/
GO
Shutdown /** 關閉SQL服務**/
GO

 

下圖就是我執行上述Code後的截圖,可以由訊息中看到該SQL服務的確被我們關閉了!

 

透過SSCM也可以看見SQL的確被停掉了,如下圖紅色圈選處。

 

此時我們直接刪掉ldf檔,目的就是不讓SQL可以透過交易紀錄檔ReDo及UnDo資料。

 

砍掉ldf檔後我們重新啟動SQL服務,如下圖紅色圈選處。

 

重啟SQL後可以看見DB1狀態變成復原暫止(如下圖紅色圈選處)。

 

要讓DB恢復正常的做法就是重新建立一個交易紀錄檔,語法如下:

Alter Database DB Set Emergency;
Alter Database DB Rebuild log On(name='DB_Log',filename='E:\SQLLOG\DB.ldf');
Alter Database DB Set Multi_User;

 

下圖是我們重建交易紀錄後的截圖,從下圖訊息中可以看見資料庫DB已重建完成交易紀錄檔。

 

重建完交易紀錄檔後,資料庫DB也恢復正常了。

 

這時候我們看一下資料表TB1的資料內容,我們可以看見TB1中有兩筆資料。其中第2筆資料在寫入後我們並沒有手動下CheckPoint指令,因此可判定SQL在停止前應該是有自動執行CheckPoint來將記憶體中的資料寫入到mdf中。

 

接下來的反證就是我們將Shutdown改為Shutdown With NoWait 的方式來停止SQL服務。用這種方式強制SQL不等待並直接停止服務。

 

接下來一樣重複先前動作,這裡就不再贅述了,我們直接看結果吧。

如下圖所示該TB1資料表只有一筆紀錄。以這樣結果看來,如果SQL是被強制中止的話並不會執行CheckPoint的動作。

 

以下是從MSDN截到的圖片,如下圖紅色圈選處說明,的確在SQL停止服務前會自動做CheckPoint動作。

參考資料來源: https://msdn.microsoft.com/zh-tw/library/ms189573(v=sql.120).aspx

 

我是ROCK

rockchang@mails.fju.edu.tw