Si të gjeni arsyen pse TempDB është plot në tuaj SQL Server

Nëse databaza e temp DB e juaj SQL Server i mbaron hapësira, mund të shkaktojë ndërprerje të mëdha në mjedisin tuaj të prodhimit dhe mund të ndërpresë aplikacionet e përdoruesve nga përfundimi i suksesshëm. Nëse po përdorni një skript për të gjurmuar madhësinë e DB-së së përkohshme, shtojini skriptin nga ky artikull për të identifikuar shkakun rrënjësor të mbushjes së DB-së së përkohshme.

Tempdb e plotë – një skenar i zakonshëm

Tempdb Pyetjet e shkruara dobët mund të krijojnë disa objekte të përkohshme që rezultojnë në një rritje të një baze të dhënash tempdb. Kjo do të rezultojë në alarme për hapësirën në disk dhe mund të shkaktojë probleme me serverin. Kur shumë SQL Server Administratorët e bazës së të dhënave e kanë shumë të vështirë ta zvogëlojnë tempdb-në, ata menjëherë zgjedhin rinisjen e serverit. Nëse do të ishin provuar të gjitha metodat për të zvogëluar bazën e të dhënave tempdb dhe nëse ajo ende nuk po zvogëlohet, opsioni i fundit është rinisja e Shërbimit SQL përmes menaxherit të konfigurimit. Kështu, alarmet e hapësirës së diskut do të ndalonin dhe problemet e serverit gjithashtu do të ndalonin. Megjithatë, rinisja e tempdb mund të mos jetë e disponueshme për ju nëse problemi do të kishte ndodhur në një server prodhimi.

DBCC

DBCCNë raste të tilla, ka disa komanda DBCC të cilat kur ekzekutohen do t'ju lejojnë të tkurni tempdb. Nëse keni vendosur skriptet për të monitoruar në mënyrë proaktive madhësinë tempdb, mund ta përdorni këtë skript për të gjetur mbushësit e tempdb. Deri tani, ky skrip do të ekzekutohej në të gjithë serverët e lidhur. Mund ta kontrolloni lehtësisht duke vendosur një klauzolë ku. Ju mund ta bëni skriptin të ekzekutohet vetëm kur ka një problem me tempdb-në tuaj. Tabela @Tserver përdoret për të ruajtur të gjithë emrat e serverëve tuaj të lidhur. Për një bazë të dhënash tempdb, Korrupsioni SQL do të ndryshonte statusin e bazës së të dhënave si SUSPECT dhe kjo do të ndërpresë SQL Server shërbim që nga fillimi.

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

Hyrje e autorit:

Neil Varley është një ekspert i rikuperimit të të dhënave në DataNumen, Inc., e cila është lider botëror në teknologjitë e rikuperimit të të dhënave, duke përfshirë rikuperoni Outlook dhe produkte softuerike të rimëkëmbjes excel. Për më shumë informacion vizitoni www.datanumen.com

Komentet janë të mbyllura.