Πώς να βρείτε τον λόγο για τον οποίο το TempDB είναι γεμάτο στο δικό σας SQL Server

Κοινή χρήση τώρα:

Εάν η προσωρινή βάση δεδομένων DB σας SQL Server εξαντληθεί ο χώρος, μπορεί να προκαλέσει μεγάλες διακοπές στο περιβάλλον παραγωγής σας και να διακόψει τις εφαρμογές των χρηστών από την επιτυχή ολοκλήρωση. Εάν χρησιμοποιείτε μια δέσμη ενεργειών για την παρακολούθηση του μεγέθους της προσωρινής μονάδας DB, προσαρτήστε τη δέσμη ενεργειών από αυτό το άρθρο για να προσδιορίσετε τη βασική αιτία για την πλήρωση του προσωρινού DB.

Tempdb full – ένα κοινό σενάριο

Tempdb Τα κακογραμμένα ερωτήματα ενδέχεται να δημιουργήσουν πολλά προσωρινά αντικείμενα, με αποτέλεσμα την αύξηση της βάσης δεδομένων tempdb. Αυτό θα οδηγήσει σε ειδοποιήσεις χώρου στο δίσκο και μπορεί να προκαλέσει προβλήματα στον διακομιστή. Όταν πολλά SQL Server Οι διαχειριστές βάσεων δεδομένων δυσκολεύονται πολύ να συρρικνώσουν το tempdb και επιλέγουν αμέσως την επανεκκίνηση του διακομιστή. Εάν είχαν δοκιμάσει όλες τις μεθόδους για να συρρικνώσουν τη βάση δεδομένων tempdb και εάν εξακολουθεί να μην συρρικνώνεται, η τελευταία επιλογή είναι να επανεκκινήσετε την υπηρεσία SQL Service μέσω του Configuration Manager. Έτσι, οι ειδοποιήσεις χώρου στο δίσκο θα σταματούσαν και θα σταματούσαν επίσης τα προβλήματα του διακομιστή. Ωστόσο, η επανεκκίνηση του tempdb ενδέχεται να μην είναι διαθέσιμη σε εσάς εάν το πρόβλημα είχε παρουσιαστεί σε έναν διακομιστή παραγωγής.

DBCC

DBCCΣε τέτοιες περιπτώσεις, υπάρχουν πολλές εντολές DBCC που όταν εκτελούνται θα σας επιτρέψουν να συρρικνώσετε το tempdb. Εάν είχατε ρυθμίσει σενάρια για να παρακολουθείτε προληπτικά το μέγεθος tempdb, μπορείτε να χρησιμοποιήσετε αυτό το σενάριο για να ανακαλύψετε τα fillers του tempdb. Από τώρα, αυτό το σενάριο θα εκτελούνταν σε όλους τους συνδεδεμένους διακομιστές. Μπορείτε να το ελέγξετε εύκολα βάζοντας μια ρήτρα όπου. Μπορείτε να κάνετε το σενάριο να εκτελεστεί μόνο όταν υπάρχει πρόβλημα με το tempdb σας. Ο πίνακας @Tserver χρησιμοποιείται για την αποθήκευση όλων των ονομάτων των συνδεδεμένων διακομιστών σας. Για μια βάση δεδομένων tempdb, Διαφθορά SQL θα άλλαζε την κατάσταση της βάσης δεδομένων ως ύποπτη και αυτό θα διακόψει SQL Server υπηρεσία από την έναρξη.

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 και υπερέχουν προϊόντα λογισμικού ανάκτησης. Για περισσότερες πληροφορίες επισκεφθείτε www.datanumen.com

Κοινή χρήση τώρα:

Τα σχόλια είναι κλειστά.