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的擦寫特點造成其壽命較短,這樣就造成了庫損壞問題,這類問題需要是可以防范的,但如果被動響應,我們仍可采用相關手段處理.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM