Cum să găsiți motivul pentru care TempDB este plin în dvs SQL Server

Distribuie acum:

Dacă baza de date temp DB a dvs SQL Server rămâne fără spațiu, poate cauza întreruperi majore în mediul dumneavoastră de producție și poate întrerupe aplicațiile utilizatorului de la finalizarea cu succes. Dacă utilizați un script pentru a urmări dimensiunea DB temporară, adăugați scriptul din acest articol pentru a identifica cauza principală a umplerii DB temporară.

Tempdb full – un scenariu comun

Tempdb Interogările scrise prost pot crea mai multe obiecte temporare, rezultând o bază de date tempdb în creștere. Acest lucru va duce la alerte privind spațiul pe disc și ar putea cauza probleme la server. Când multe SQL Server Administratorii de baze de date consideră că este foarte dificil să micșoreze baza de date tempdb, aceștia optează imediat pentru repornirea serverului. Dacă s-ar fi încercat toate metodele de a micșora baza de date tempdb și aceasta tot nu se micșorează, ultima opțiune este repornirea serviciului SQL prin intermediul managerului de configurare. Astfel, alertele privind spațiul pe disc s-ar opri, precum și problemele legate de server. Cu toate acestea, este posibil ca repornirea bazei de date tempdb să nu fie disponibilă dacă problema a apărut pe un server de producție.

DBCC

DBCCÎn astfel de cazuri, există mai multe comenzi DBCC care, atunci când sunt executate, vă vor permite să micșorați tempdb. Dacă ați configurat scripturi pentru a monitoriza în mod proactiv dimensiunea tempdb, puteți utiliza acest script pentru a afla elementele de umplere ale tempdb. De acum, acest script va fi executat pe toate serverele legate. Îl poți controla cu ușurință punând o clauză where. Puteți face ca scriptul să fie executat numai atunci când există o problemă cu tempdb. Tabelul @Tserver este folosit pentru a stoca toate numele serverelor conectate. Pentru o bază de date tempdb, Coruperea SQL ar schimba starea bazei de date ca SUSPECT și aceasta va întrerupe SQL Server serviciu de la pornire.

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

Introducerea autorului:

Neil Varley este un expert în recuperarea datelor DataNumen, Inc., care este lider mondial în tehnologiile de recuperare a datelor, inclusiv recuperați Outlook și produse software de recuperare Excel. Pentru mai multe informații vizitați www.datanumen.com

Distribuie acum:

Comentariile sunt închise.