天天看點

Sql Server tempdb原理-啟動過程解析實踐

我們知道在SqlServer執行個體啟動過程中資料庫會進行還原(Redo,Undo)然後打開提供服務,但我們知道tempdb是不提供重做機制的(Redo)那tempdb是如何還原的呢?如果tempdb損壞我們該怎麼辦,這裡我将通過執行個體給大家介紹.

有時tempdb因為一些原因會變得非常巨大,一些DBA的解決方式就是重新開機資料庫執行個體,的确重新開機後tempdb就會恢複到初始設定大小,理由很簡單tempdb會重新建立.

Tempdb的建立過程.

1在model庫打開後進行tempdb建立(可以日志中看到model總是在tempdb之前打開)

2從model庫中拷貝extent(s)到tempdb主檔案并根據master庫中的meta data資訊建立tempdb主資料檔案(Mdf)

3 根據master中定義tempdb的主檔案大小填充主檔案

4 根據master中定義的主日志檔案大小建立日志檔案

5 建立,附加其他檔案

注:如果tempdb不能建立,則執行個體shutdown

這裡我們做個測試在model庫中簡單的建立一個表然後重新開機執行個體

code

use model
create table t1(id int)      

重新開機執行個體後我們可以發現tempdb中也存在表t1 如圖1-1,其實就是tempdb啟動時主檔案要從model中拷貝擴充區(extent).我們甚至可以分析相應的資料頁,可以看到相應的資料頁tempdb與model是完全一緻的.感興趣的朋友可以自行嘗試.

                                     圖1-1

問題來了,我們可以看到tempdb是先通過master确定檔案位置,大小的,如果啟動過程中從master庫中獲得位置的磁盤損壞或者不存在,那麼tempdb将無法建立,執行個體也就無法啟動,這将是一個執行個體級問題,影響嚴重.

此時我們可以使用trace flag 3608在隻還原master的情形下啟動執行個體,并進行相應調整,然後重新啟動資料庫.

注意:tf3608啟動資料庫時是個極其特殊的情形,這時我們最好使用最小配置啟動(/f),以避免對資料庫造成其他的意外操作(損壞)

最小配置啟動 /f

a.單使用者模式

b.無法檢查點(checkpoint)

c.不支援遠端通路及預讀

d.禁止啟動執行Proc

模拟故障

1 将tempdb檔案修改到其他盤符

2 重新啟動時disable相應盤符,則sql server無法啟動 如圖1-2

Code

Alter Database tempdb Modify File (Name = 'tempdev', FileName = 'E:\tempdb.mdf')

Alter Database tempdb Modify File (Name = 'templog', FileName = 'E:\templog.ldf')      

                                                                                圖1-2

這種情況下資料庫執行個體是無法正常啟動的我們可以用先前提到的tf3608在隻還原master的情形下最小化配置/f啟動,然後做相應修改.

注意:最小化配置啟動由于是單使用者模式,啟動前我們應該關閉與執行個體相關的程序.(如sqlagent) 否則将使用者将無法通路執行個體

處理步驟

1 Code(Dos下),或是配置管理器中配置啟動參數

Net start mssqlserver /t3608 /f      

2用sqlcmd以管理者連結方式進入執行個體執行相關調整,具體資訊如圖1-3

sqlcmd -A -S localhost -q"Alter Database tempdb Modify File (Name = 'tempdev', FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\tempdb.mdf');"

sqlcmd -A -S localhost -q"Alter Database tempdb Modify File (Name = 'templog', FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\templog.ldf',);"      

3調整完畢後重新啟動資料庫

                                                                        圖1-3

這樣我們就在特定情形中完成了對tempdb的調整.

關于tempdb日志

我們都知道日志檔案是不能進行及時初始化的.是以最好預先設定其大小,避免導緻其因為檔案增長造成的tempdb性能瓶頸.

結語

現實中由于tempdb的特定角色導緻其很可能成為性能瓶頸,有些應用者基于性能考量将tempdb放入特定磁盤上如SSD,由于tempdb的工作特點,導緻其複寫率可能非常高,這樣基于SSD的擦寫特點造成其壽命較短,這樣就造成了庫損壞問題,這類問題需要是可以防範的,但如果被動響應,我們仍可采用相關手段處理.

Involuntary DBA

繼續閱讀