如何找到您的TempDB已滿的原因 SQL Server

立即分享:

如果您的temp DB數據庫 SQL Server 空間不足,可能會導致生產環境中的重大中斷,並可能中斷用戶應用程序的成功完成。 如果您使用腳本來跟踪臨時數據庫的大小,請附加本文中的腳本以標識臨時數據庫填充的根本原因。

Tempdb已滿–常見情況

臨時數據庫 寫得不好的查詢可能會造成一些節奏rary個對象導致tempdb數據庫的增長。 這將以磁盤空間警報結尾,並可能導致服務器出現問題。 當很多 SQL Server 數據庫管理員發現縮小tempdb非常困難,他們立即選擇服務器資源tart。 如果嘗試了所有方法來縮小tempdb數據庫,並且仍然無法縮小,則最後一個選擇是restart通過配置管理器的SQL服務。 因此,您的磁盤空間警報將停止,服務器問題也將停止。 但是,restar如果生產服務器上發生了問題,則可能無法使用ting tempdb。

數據庫管理中心

數據庫管理中心在這種情況下,有幾個DBCC命令在運行時將允許您收縮tempdb。 如果您設置了腳本來主動監視tempdb的大小,則可以使用此腳本來查找tempdb的填充符。 到目前為止,此腳本將在所有鏈接服務器上執行。 您可以通過放置where子句輕鬆控制它。 您可以使腳本僅在tempdb存在問題時才執行。 @Tserver表用於存儲所有鏈接的服務器名稱。 對於tempdb數據庫, SQL損壞 會將數據庫的狀態更改為SUSPECT,這將中斷 SQL Server 來自的服務tar婷

DECLARE @Tserver TABLE 
  ( 
     cserver VARCHAR(200) 
  ) 

INSERT INTO @Tserver 
VALUES      ('SERVERNAME') 

DECLARE @LogTable TABLE 
  ( 
     cservername VARCHAR(200), 
     cssionid    SMALLINT, 
     callocmb    BIGINT, 
     cdeallocmb  BIGINT, 
     ctext       VARCHAR(4000), 
     cstatement  VARCHAR(4000) 
  ) 
DECLARE c1 CURSOR FOR 
  SELECT * 
  FROM   @Tserver 
DECLARE @cmd    NVARCHAR(4000), 
        @server VARCHAR(200) 

OPEN c1 

FETCH next FROM c1 INTO @server 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      SET @cmd = 'EXEC(''use tempdb Declare @Table1 table  ( cdeallopages bigint, callopages bigint, cssionid smallint, creqstid int ) insert into @Table1 SELECT SUM(internal_objects_dealloc_page_count), SUM(internal_objects_alloc_page_count), session_id, request_id  FROM sys.dm_db_task_space_usage WITH (NOLOCK) WHERE session_id <> @@SPID GROUP BY session_id, request_id declare @Table2 table ( cssionid smallint, callocmb bigint, cdeallocmb bigint, ctext varchar(4000), cstatement varchar(4000) ) insert into @Table2 SELECT TBL1.cssionid, TBL1.callopages * 1.0 / 128 , TBL1.cdeallopages * 1.0 / 128 , TBL3.text, ISNULL( NULLIF( SUBSTRING( TBL3.text,  TBL2.statement_start_offset / 2,  CASE WHEN TBL2.statement_end_offset < TBL2.statement_start_offset  THEN 0  ELSE( TBL2.statement_end_offset - TBL2.statement_start_offset ) / 2 END ), '''''''' ), TBL3.text ) FROM @Table1 AS TBL1 INNER JOIN sys.dm_exec_requests TBL2 WITH (NOLOCK) ON  TBL1.cssionid = TBL2.session_id AND TBL1.creqstid = TBL2.request_id OUTER APPLY sys.dm_exec_sql_text(TBL2.sql_handle) AS TBL3 OUTER APPLY sys.dm_exec_query_plan(TBL2.plan_handle) AS TBL4 WHERE TBL3.text IS NOT NULL OR TBL4.query_plan IS NOT NULL ORDER BY 3 DESC; Select * from @Table2'') at [' + @server + ']' 

      PRINT @cmd 

      INSERT INTO @LogTable 
                  (cssionid, 
                   callocmb, 
                   cdeallocmb, 
                   ctext, 
                   cstatement) 
      EXEC(@cmd) 

      UPDATE @LogTable 
      SET    cservername = @server 
      WHERE  cservername IS NULL 

      FETCH next FROM c1 INTO @server 
  END 

CLOSE c1 

DEALLOCATE c1 

SELECT * 
FROM   @LogTable

作者簡介:

Neil Varley是的數據恢復專家 DataNumen,Inc.是數據恢復技術的全球領導者,包括 恢復Outlook 和excel恢復軟件產品。 欲了解更多信息,請訪問 萬維網。datanumen.COM

立即分享:

評論被關閉。