Εάν η προσωρινή βάση δεδομένων DB σας SQL Server εξαντληθεί ο χώρος, μπορεί να προκαλέσει μεγάλες διακοπές στο περιβάλλον παραγωγής σας και να διακόψει τις εφαρμογές των χρηστών από την επιτυχή ολοκλήρωση. Εάν χρησιμοποιείτε μια δέσμη ενεργειών για την παρακολούθηση του μεγέθους της προσωρινής μονάδας DB, προσαρτήστε τη δέσμη ενεργειών από αυτό το άρθρο για να προσδιορίσετε τη βασική αιτία για την πλήρωση του προσωρινού DB.
Tempdb full – ένα κοινό σενάριο
Τα κακογραμμένα ερωτήματα ενδέχεται να δημιουργήσουν πολλά προσωρινά αντικείμενα, με αποτέλεσμα την αύξηση της βάσης δεδομένων tempdb. Αυτό θα οδηγήσει σε ειδοποιήσεις χώρου στο δίσκο και μπορεί να προκαλέσει προβλήματα στον διακομιστή. Όταν πολλά SQL Server Οι διαχειριστές βάσεων δεδομένων δυσκολεύονται πολύ να συρρικνώσουν το tempdb και επιλέγουν αμέσως την επανεκκίνηση του διακομιστή. Εάν είχαν δοκιμάσει όλες τις μεθόδους για να συρρικνώσουν τη βάση δεδομένων tempdb και εάν εξακολουθεί να μην συρρικνώνεται, η τελευταία επιλογή είναι να επανεκκινήσετε την υπηρεσία SQL Service μέσω του Configuration Manager. Έτσι, οι ειδοποιήσεις χώρου στο δίσκο θα σταματούσαν και θα σταματούσαν επίσης τα προβλήματα του διακομιστή. Ωστόσο, η επανεκκίνηση του tempdb ενδέχεται να μην είναι διαθέσιμη σε εσάς εάν το πρόβλημα είχε παρουσιαστεί σε έναν διακομιστή παραγωγής.
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