服務器結構
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會銷毀它以釋放內存。
以下文章點擊率最高
Loading…