捕捉SQL Server 2005數據庫大小的趨勢,這是非常重要的,因為DBA們可以利用這些信息來規劃未來的空間需求,問題的通知類型,並規劃繁重負載的時間段。本文將介紹一種捕捉這一信息的簡單的方法。
SQL Server上的每個數據庫都包含了關於數據庫文件的大小的信息,連同其他一些相關信息。為了得到這個信息,我們需要一個方法來從單個數庫中一次性檢索出相關的數據。
有兩個方法可以實現這個功能:
sp_spaceused:這個系統存儲過程將返回當前數據庫中的表、索引視圖或 SQL Server 2005 Service Broker 隊列所使用的磁盤空間。這是存儲過程的返回數據庫或者數據庫中表的大小,但是報告的輸出內容不太友好,不好理解。該存儲過程通過腳本來捕獲每個數據庫的信息,但它可能需要用到用戶自定義的光標。
sp_msforeachdb:這是一個非常有用的系統存儲過程,將任何SQL腳本傳遞給你在每個數據庫上的SQL Server實例上來執行。存儲過程遍歷每個數據庫,這樣就省卻了您一項項指定數據庫名稱了。本文我們將利用這個存儲過程來捕獲各個數據庫文件大小的信息。
這些資料我想收集和儲存可以在sys.database_files系統視圖中獲得,包括數據庫文件的大小,以及其他一些相關的信息,如數據庫狀態,數據庫文件的增長方式(按絕對大小遞增還是按百分比遞增),是否是只讀的等等。我需要捕獲每個數據庫中的這些信息。
下面的腳本以系統視圖sys.database_files的結構為基礎,創建一個名為DatabaseFiles表(如果它不存在的話),還增加了一個新的字段,用來記錄捕獲的記錄什麼時候插入到數據表中。
IF OBJECT_ID('DatabaseFiles') IS NULL
BEGIN
SELECT TOP 0 * INTO DatabaseFiles
FROM sys.database_files
ALTER TABLE DatabaseFiles
ADD CreationDate DATETIME DEFAULT(GETDATE())
END
現在需要填充DatabaseFiles數據表。下面這個腳本使用sp_msforeachdb存儲過程,並通過一個SQL腳本從sys.database_files讀取數據,並插入到DatabaseFiles數據表中。
EXECUTE sp_msforeachdb 'INSERT INTO DatabaseFiles SELECT *, GETDATE() FROM [?].sys.database_files'
從腳本中我們可以發現,每個數據庫的數據庫名稱,有點特別:使用[ ?]作為視圖sys.database_files的前綴。
此代碼執行時,實際上是遍歷每個數據庫實例,將數據庫名稱作為參數代替[ ?]標記。每個數據庫的信息,將插入到DatabaseFiles表。這比自己寫一個自定義游標實現起來容易很多。我還增加了一個GETDATE( )函數,用來記錄記錄插入到表中的時間。
注意:這個例子有點違背編碼標准,使用SELECT *插入到一個表時,沒有明確寫明字段名稱不列清單。如果用於實際項目中,建議大家作下修改,注明字段名稱。
為了確保正確捕獲到所有的數據,我們來看看DatabaseFiles數據表中的內容。
SELECT * FROM DatabaseFiles
執行上面的命令後,可以得到類似以下的信息:
圖1:查看捕獲到的數據庫大小的數據