程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 數據庫服務器的磁盤空間的監控和分析方法

數據庫服務器的磁盤空間的監控和分析方法

編輯:關於SqlServer
 

確保數據庫服務器上的磁盤空間充足,防止在數據庫生產過程中數據量過大導致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解決方案中說明的。
  完成或取消長時間運行的事務,具體方案待確定。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved