確保數據庫服務器上的磁盤空間充足,防止在數據庫生產過程中數據量過大導致tempdb或事物日志文件迅速的擴大,而消耗全部的磁盤空間。但在實際情況總磁盤空間耗盡的情況還是很常見,現以在實際工作中處理的類似問題過程中總結出的解決分析方法。
一、 tempdb數據庫磁盤空間不足
如果tempdb中的磁盤空間用盡,可能導致SQLServer生產環境受嚴重破壞,並且可能會阻止正在運行的應用程序完成操作。針對tempdb數據庫磁盤空間不足的錯誤消息可以在SQLServer錯誤日志中。主要的錯誤的代碼有:
錯誤
引發錯誤的情況
1101或1105
任何會話都必須分配tempdb中的空間
3959
版本存儲區已滿
3967
tempdb已滿,版本存儲區被強制收縮
3958或3966
事務在tempdb中找不到需要的版本記錄
二、 事務日志文件磁盤空間不足
事務日志是數據庫的重要的組件,如系統出現故障,則可能需要使用事務日志將數據庫恢復到一致狀態。如果在數據庫聯機時數據庫已滿,則數據庫保持聯機狀態,但只能進行讀取而不能更新,這樣將造成生產能力下降。主要錯誤代碼:
錯誤碼
引發錯誤情況
9002
事務日志文件已滿
三、 解決方案
1. 未雨綢缪,了解磁盤使用狀況,發現潛在磁盤空間不足的服務器
查看數據庫磁盤使用狀況,可以使用SQL Server Studio Manager,具體操作。
a) 在對象資源管理器中,連接到SQL Server的實例
b) 展開數據庫
c) 右鍵單擊某數據庫,依次選擇“報表”-> “標准報表”->“磁盤使用情況”。
得到類似結果如下,可以通過圖表直觀的查看數據庫磁盤使用狀況:
對於圖表中注意兩點: 全部空間特別大的但未使用空間很小的。並根據這兩點張開結合數據庫服務器上的實際情況進行分析。
2. 針對潛在空間不足服務器監控器磁盤使用狀況
登錄到服務器後,開始收集必要的信息進行分析。主要的目的是為了解數據庫中的tempdb和事務日志文件使用情況,隨後采用腳本進行進一步的分析。
針對temp數據庫的監控方法:
a) 收集必要的信息。
查看tempdb數據庫模式,通過這一點可得知在數據庫收縮過程中的行為;
查看數據庫的初始值,增長速度,最大大小等。通過這些可以了解數據庫在增長過程中特點。
查看數據庫作業中是否有和tempdb相關,如果則明確實際的操作行為。
b) 監控方法的說明。
b.1確定tempdb中可用空間,使用腳本:
SELECT SUM(unallocated_extent_page_count) AS [未用頁],
SUM(unallocated_extent_page_count)*1.0/128) AS [可用空間MB]
FROM sys.dm_db_file_space_usage;
通過這個腳本將返回tempdb中所有文件的總可用頁數和總空間(MB),對於查詢結果中注意兩種情況:第一種情況 tempdb很大但是可用空間很多,說明這時數據庫的大小只是虛高,但應該注意的是在之前的某個時間段可能數據量很大,導致tempdb文件增長;第二種情況tempdb很大,可用空間也不多,這時說明確實是比較繁忙,對於這種情況應特別注意。
b.2 確定運行時間最長的事務,內部和外部對象使用的空間。
查看運行時間最長的事務的腳本:
SELECT transation_id
FROM
sys.dm_tran_active_snapshot_database_transactions
OREDR BY elapsed_time_seconds DESC;
查看內部對象使用的空間量:
SELECT SUM(internal_object_reserved_page_count) AS [內部對象使用],
(SUM(internal_object_reserverd_page_count)*1.0/128) AS [內部對象大小]
FROM sys.dm_db_file_space_usage;
查看用戶對象使用空間:
SELECT SUM(user_object_reserved_page_count) AS[用戶對象使用],
(SUM(user_object_reserved_page_count)*1.0/128)AS[用戶對象大小]
FROM sys.dm_db_file_space_usage;
通過這三個腳本可得知是tempdb目前占用空間大的原因,供進一步的解決問題提供線索依據。
3. 數據庫磁盤空間不足的情況還是發生時應對方案
3.1 tempdb所在的磁盤空間不足。
1. 判斷目前tempdb中的可用空間,有可能是在目前tempdb文件很大,但是還有很多的空間可用,使用上述b.1腳本進行查看。若可用空間很大,這時可考慮在合適的時間進行收縮事務臨時數據庫,若可用空間很小,則執行2,3步中的操作。
2. 執行上述b.2腳本操作,分析tempdb占用空間過大的原因。
有長時間運行的事務的情況,原因眾多。可能是事務本身特點就是造成長時間的運行,這時應從實際的生產環境進行分析;可能是由於死鎖造成,這時應詳細對的T-SQL語句進行分析,找出問題並解決問題。
對象長期占用空間未釋放,造成的原因類似於長時間運行的事務。
3. 緩解空間不足的操作
將數據文件移到另一磁盤,使用T-SQL腳本:
USE master;
GO
ALTER DATABASE DataBaseName
MODIFY FILE
(NAME=LogicFileName,FILENAME=N’New Path’);
GO
在其他磁盤上添加文件
USE master;
GO
ALTER DATABASE DataBaseName
ADD FILE
(NAME=LogicName,FILENAME=N’path’,SIZE=x,MAXSIZE=x,
FILEGROWTH=x);
GO
收縮臨時庫文件
3.2事務日志文件所在磁盤的磁盤空間不足。
1. 首先查看事務日志文件可用的空間,使用T-SQL腳本:
DBCC SQLPERF (LOGSPACE)
GO
如果可用空間很大,可考慮在合適的時間進行收縮事務日志文件,若可用空間很小,進行2,3步的操作。
2. 事務日志文件的截斷是自動發生,但是有可能是各種原因導致日志截斷延遲,這時可以先查看是否有延遲截斷的原因。使用T-SQL語句分析原因:
SELECT log_reuse_wait,log_reuse_wait_desc FROM sys.databases;
由於數據備份操作與還原操作時不會進行截斷操作,這時調整備份數據和還原操作的時間不和日志文件截斷時間(數據庫繁忙時段)沖突。
由於長時間運行的活動事務。
由於數據庫鏡像原因,對於鏡像服務器實例落後於主服務器,則日志活動會增加,對於這時的操作最好先停止數據庫鏡像,執行截斷日志的日志備份。
由於事務復制原因影響事務日志大小。
3. 緩解空間不足的操作
進行備份日志
將日志文件移到具有足夠空間的磁盤。
在其他磁盤添加日志文件,操作類似上述tempdb解決方案中說明的。
完成或取消長時間運行的事務,具體方案待確定。