服務器結構
SQL Server服務器可以看成是由實例及數據庫構成。實例包括SQL Server占用的內存及后臺線程。
??與Oracle顯著不同的是,SQL Server服務器的數據庫是多個,其中包括5個系統數據庫及若干個用戶數據庫(其中的resource數據庫存儲系統數據,對用戶不可見)。每個數據庫包括數據文件及重做日志文件,SQL Server數據庫不包含控制文件。
Oracle服務器 = 一個Oracle實例+一個數據庫
SQL Server服務器 = 一個SQL Server實例+多個數據庫
數據庫相關文件
SQL Server的數據庫文件包括:
- 數據文件:存放數據庫中的數據。
- 重做日志文件:存放用戶對數據庫的操作記錄,用于實例恢復或介質恢復。
SQL Server中的數據文件
??數據文件與重做日志文件的作用與Oracle對應的文件相同,只是SQL Server的重做日志文件除了包含重做數據外,還包含回滾事務所用的undo數據,Oracle的重做日志文件只包含重做數據,undo數據存儲在undo表空間。
SQL Server中的“控制文件”
??SQL Server沒有控制文件,實例中的各個數據庫文件信息存儲在master系統數據庫以及用戶數據庫的primary文件組的主數據文件中。
SQL Server中的“初始化參數文件”
??SQL Server沒有初始化參數文件(初始化參數文件用于保存實例啟動及運行時各種參數配置),實例的配置信息保存在master系統數據庫中,數據庫的配置信息保存在各自數據庫的primary文件組的主數據文件中。
SQL Server中的“口令文件”
??Oracle中的口令文件保存sys用戶及具備sysdba系統權限的用戶的口令,其他用戶的口令保存在數據庫中,這是因為sys用戶除了在數據庫中擁有管理權限外,還擁有啟動和關閉數據庫等特殊權限,如果sys用戶的口令也與其他用戶的口令一樣存儲在數據庫中,顯然在數據庫打開之前,就無法驗證其口令的正確性。但是SQL Server沒有口令文件,啟動SQL Server各種服務都是由操作系統行號完成的,其口令由操作系統維護。
歸檔日志文件
??SQL Server沒有歸檔日志文件,Oracle歸檔日志的功能通過事務日志文件備份實現。
SQL Server中的錯誤日志
??Oracle中的警告文件記錄著數據庫運行的信息,根據這個文件我們可以知道發生了什么內部錯誤,什么時候創建了表空間,什么時候把表空間或數據文件脫機、聯機,數據庫啟動關閉等信息。出現錯誤時,如果不能確定原因,應該首先查看經該文件的內容,以得到解決問題的線索,警告文件從數據庫創建開始一直到被刪除。Oracle數據庫的警告文件在SQL Server中稱為錯誤日志(Errorlog),是實例范圍的,而不是針對某個數據庫的,與Oracle的警告文件類似,由SQL Server錯誤日志可以查看在實例運行過程中出現的錯誤。SQL Server的錯誤日志文件的位置為:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log。
??注意區分這里的SQL Server錯誤日志與數據庫重做日志文件,SQL Server錯誤日志時文本文件,是提供給數據庫管理員用來查看服務器運行過程中的問題的,SQL Server數據庫正常運行并不需要錯入日志文件,而數據庫的重做日志文件是數據庫必須的,其目的是為了在出現故障時,恢復數據庫。
??服務器啟動時,會創建新的錯誤日志文件ERRORLOG,上一次的ERRORLOG被重命名為ERRORLOG.1,ERRORLOG.1被重命名為ERRORLOG.2,依次類推,一直到ERRORLOG.5,被重命名為ERRORLOG.6,而ERRORLOG.6被刪除,這樣,錯誤日志最多保留6個備份。執行sp_cycle_errorlog系統存儲過程可以自動創建新的ERROR文件并執行上述修改名稱的過程,而不必重啟服務器。
??可以使用任何文本編輯器在操作系統上查看其內容,也可以在Management Studio中通過“管理——>SQL Server日志”查看其內容,如下圖所示。
內存結構
1.內存構成
??SQL Server的內存主要由兩部分構成:buffer cache及其他部分。
??buffer cache也稱為buffer pool,是SQL Server占用內存的主要部分,其作用類似于Oracle的SGA。buffer cache中的主要部分為data cache,相當于Oracle實例SGA中的database buffer cache部分,用于存放由磁盤讀取的數據,再次讀取時不必從磁盤讀取。一般情況下,這是buffer cache中最大的一個區域。
??buffer cache中的另外一個重要部分為plan cache,用于存放編譯過的執行計劃,相當于Oracle實例shared pool中的library cache部分。
2.配置內存大小
??與SQL Server內存分配相關的服務器參數有兩個:
- max server memory:設置buffer cache的上限
- min server memory:設置SQL Server可以釋放內存的buffer cache下限。
max server memory的默認設置為2 147 483 647,min server memory的默認設置為0,可以為max server memory指定的最小內存量為16MB。默認情況下, SQL Server 的內存要求會根據可用系統資源的情況動態變化。
將 max server memory 設置為最小值可能會嚴重降低 SQL Server 性能,甚至導致無法啟動。 如果在更改此選項之后無法啟動 SQL Server ,請使用 –f 啟動選項啟動它,并將 max server memory 重置為以前的值。
下面是設置這兩個參數的方法。
??先執行以下兩個命令:
#先開啟高級選項
SP_CONFIGURE 'show advanced options',1
#然后執行
RECONFIGURE WITH OVERRIDE
執行以上兩個命令之后才能使用命令行進行參數配置。
??配置max server memory的值為500MB:
1> sp_configure 'max server memory','500'
2> go
配置選項 'max server memory (MB)' 已從 2147483647 更改為 500。請運行 RECONFIGURE 語句進行安裝。
1> reconfigure
2> go
配置min server memory的值為300MB:
1> sp_configure 'min server memory','300'
2> go
配置選項 'min server memory (MB)' 已從 0 更改為 300。請運行 RECONFIGURE 語句進行安裝。
1> reconfigure
2> go
也可以使用SQL Server Management Studio 配置內存選項:
1.在對象資源管理器中,右鍵單擊“服務器”并選擇“屬性”。
2.單擊 “內存” 節點。
3.在 “服務器內存選項”中,為 “最小服務器內存” 和 “最大服務器內存”輸入所需的內存量。
??而對于具體的SQL Server如何使用內存,例如分配給執行計劃緩存多少,分配給數據buffer多少,這些都無法通過配置進行調控。
??一般情況下,SQL Server的內存分配不需要用戶干預,SQL Server盡力做到獲得盡量多的內存,又不會使系統出現內存短缺現象。
??SQL Server在啟動時,根據當前負荷分配必要的內存數量,這個數量可能小于min server memory的值,如果負荷一直不大,其內存占用可能在很長時間內不會到達min server memory的值。
??運行過程中,SQL Server會隨著負荷及用戶連接數的增長繼續分配內存,直到內存總量達到max server memory值,或者操作系統提示內存短缺為止。
??當SQL Server占用的內存超過min server memory的值,而且Windows系統因為其他應用的運行提示空閑內存缺少時,SQL Server會釋放內存,但會保持內存不低于min server memory的值,當這些應用退出時,SQL Server又會獲取更多的內存。在一秒鐘之內,SQL Server可以釋放或獲取幾兆字節的內存。
??如果SQL Server占用的內存尚未達到min server memory的值,則這些內存會一直保持,而不會釋放。
??如果max server memory與min server memory配置為相同的值,內存占用量達到這個后,不會繼續分配也不會釋放,這種方式可以使SQL Server占用固定數量的內存。
??另外要注意,SQL Server占用的內存總量可能會超過max server memory值,因為max server memory只是設置的buffer cache的上限,除此之外,SQL Server還需要分配其他功能的內存。
主要進程(線程)
SQL Server的Lazy Writer與CheckPoint線程是SQL Server的主要線程。
①Lazy Writer進程
??Lazy Writer存在的目的是對緩沖區進行管理,保證SQL OS 有空閑緩存塊和系統有一定可用內存。作用如下:
- 管理SQLServer空閑內存:
定期檢查空閑緩沖列表的大小,當這個值過低的時候,即當data cache的空閑內存不夠時,azy Writer搜索data cache,把臟塊寫入磁盤,并把這些可以重新使用的內存頁放入自由列表(free list),即會更新緩存區空閑可用列表,而將未修改的頁釋放并回收資源,以增大空間內存數量。 - 協調Windows與SQLServer內存
- 監視服務器內存,如果Windows物理內存很少,它會從空閑緩沖列表中釋放內存給Windows;
- 在SQLServer負載很重時,它還會在分配給SQLServer的內存沒有達到最大服務器內存閥值時,增加空閑緩沖列表的大小,以適應負載的需要。也就是Lazy Writer會縮小或擴充data cache的大小,使得系統空閑內存保持在5MB左右。
②CheckPoint進程
??檢查點(CheckPoint)存在的意義是減少服務器的恢復時間(Recovery Time)。檢查點是CheckPoint進程創建的,是數據庫的一個事件,也是數據庫恢復的起始點。
??出于性能方面的考慮,數據庫引擎對內存中的數據庫頁進行修改,但在每次更改后不將這些頁寫入磁盤,相反,數據庫引擎定期發出對每個數據庫的檢查點命令將內存的臟頁和事務日志信息刷新到磁盤,不管臟頁中的數據是否已經commit。 這樣當數據庫發生崩潰的情況再次重啟時,這個CheckPoint時間點會作為數據庫恢復的起始點,從而用于重做(redo)的時間不會過長,這與Oracle相似。與Oracle不同,SQL Server的CheckPoint并不會起到同步各種文件的作用。
??如下情況都可以觸發CheckPoint啟動:
- 用戶發出checkpoint命令;
- 對數據庫添加或刪除了文件;
- 對大容量日志恢復模式下數據庫執行了大容量操作;
- 當數據庫處于簡單恢復模式時,如果重做日志文件的數據量超過了文件總大小的70%,也會激發Checkpoint啟動,在把臟塊寫入磁盤的同時,checkpoint會截斷重做日志,以釋放空間。如果重做日志文件的充滿是由于一個事務長時間未結束,則checkpoint不會啟動;
- 當SQL Server預測的恢復時間超過了預設的recovery interval的值,也會激發checkpoint啟動,recovery interval默認為0,這種情況下,SQL Server自動選取一個合適的值,一般為1分鐘;
- 對數據庫執行了備份操作;
- 正常關閉SQL Server實例服務
Lazy Writer和Checkpoint對比
??不像Lazy Writer,Checkpoint對SQL Server的內存管理毫無興趣,所以CheckPoint也就意味著在這個點之前的所有修改都已經保存到了磁盤。并且CheckPoint把臟數據頁寫入磁盤后,并不把這些可以再次使用的內存數據頁放入自由列表,即不會從緩存中移出臟頁,CheckPoint進程的工作只是保證臟頁被寫入磁盤。
??另外還要注意,并不只是Lazy Writer和Checkpoint執行寫磁盤操作,執行讀寫任務的Work線程(這里的Work線程相當于Oracle中對客戶端連接提供服務的服務器進程)在執行相關操作時,也會檢查data cache的自由列表上的空閑內存是否少過,如果過少的話,它也會把臟塊寫入磁盤,并把這些內存頁放入自由列表。因此Checkpoint啟動時,很可能無事可做,因為把臟塊寫入磁盤的任務已經被Lazy Writer或Work線程完成了。
影響檢查點操作持續時間的因素
??檢查點的頻率對于數據庫的恢復時間具有極大的影響,如果檢查點的頻率高,那么恢復時需要應用的重做日志就相對得少,檢查時間就可以縮短。
??但是通常,執行檢查點操作所需的時間會隨著該操作必須寫入的臟頁數的增加而增加。 默認情況下,為最大程度地降低對其他應用程序性能的影響,SQL Server 將調整檢查點操作執行寫入的頻率。
SQL Server系統數據庫
系統數據庫包括master、model、msdb、tempdb以及resource數據庫。
??①master:保存整個服務器的系統信息,如服務器配置信息、登陸賬號信息、其他數據庫的數據庫文件信息等。
??②model:是數據庫的模板,當用戶創建新的數據庫時,SQL Server復制model數據庫的結構作為新數據庫的開始,用戶可以修改這個數據庫的選項設置,添加新用戶或創建各種數據庫對象,以使其他新建的用戶數據庫都具備某些特征。但是用戶不能對model數據庫添加文件組,它只包含primary文件組,也不能向primary文件組添加新的數據文件,它只能包含一個主數據文件。但用戶可以更改主數據文件和重做的大小及其他特征,如果在建庫時未指定文件組及重做文件,則新數據庫主數據文件會繼承model數據庫的主數據文件大小,但是其他如自動增長、最大大小等屬性不會繼承,新數據庫的重做文件大小及屬性也不會繼承model數據庫的重做文件的相應屬性。
??③msdb:當配置了數據庫的自動化管理時,msdb數據庫保存自動化作業的配置信息。
??④tempdb:類似Oracle數據庫的臨時表空間,用于保存臨時表以及數據庫運行過程中的排序或散列操作產生的臨時數據。另外tempdb數據庫還保存了用于實現行版本控制的數據(row version store),這些數據的功能與Oracle數據庫的undo表空間數據類似。
??⑤resource:保存sys架構中的數據,主要是數據字典數據。在Management Studio中,這個數據庫不會顯示出來,用戶也不能在sqlcmd中使用use resource命令登陸這個數據庫,而只能通過訪問sys架構下的對象間接訪問resource數據庫中的內容。用戶查詢數據字典視圖獲得服務器或數據庫的系統信息。
客戶端連接的處理模式
對于客戶端連接,SQL Server只有一種處理模式,類似于Oracle的共享服務器模式。在Oracle共享服務器模式下,管理員可以手工設定并發服務器進程的數量,多個客戶端連接會共用一個服務器進程。在這種模式下,還會啟動另外的稱為Dispatcher的進程,負責把服務器進程分配給客戶端連接。
??對應于每個CPU,SQL Server會啟動一個Scheduler,可以看成是邏輯CPU。Oracle中處理客戶端連接的服務器進程在SQL Server中稱為Work線程(或纖程),每個Work線程大約占用0.5MB內存。
??當有客戶端請求時,會交給當前負荷最低的Scheduler,如果這時沒有空閑的Work線程,這個Scheduler會啟動一個Work線程來處理這個請求,當一個Work線程在15分鐘內部都處于空閑狀態,Scheduler會銷毀它以釋放內存。