標籤:des style blog http color 使用 os io
我們知道在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 modelcreate 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的擦寫特點造成其壽命較短,這樣就造成了庫損壞問題,這類問題需要是可以防範的,但如果被動響應,我們仍可採用相關手段處理.