Wenn die temporäre DB-Datenbank Ihres SQL Server Wenn der Speicherplatz knapp wird, kann dies zu erheblichen Störungen in Ihrer Produktionsumgebung führen und Benutzeranwendungen nach erfolgreichem Abschluss unterbrechen. Wenn Sie ein Skript zum Verfolgen der temporären DB-Größe verwenden, fügen Sie das Skript aus diesem Artikel hinzu, um die Hauptursache für die temporäre DB-Füllung zu ermitteln.
Tempdb full - ein häufiges Szenario
Schlecht geschriebene Abfragen können zahlreiche temporäre Objekte erzeugen, was zu einer wachsenden tempdb-Datenbank führt. Dies kann zu Warnungen wegen Speicherplatzmangels und Serverproblemen führen. SQL Server Datenbankadministratoren haben oft Schwierigkeiten, die tempdb zu verkleinern und greifen daher umgehend zu einem Serverneustart. Sollten alle Methoden zur Verkleinerung der tempdb erfolglos bleiben, bleibt als letzte Option der Neustart des SQL Server-Dienstes über den Konfigurationsmanager. Dadurch werden die Warnungen bezüglich des Speicherplatzes und die Serverprobleme behoben. Ein Neustart der tempdb ist jedoch möglicherweise nicht möglich, wenn das Problem auf einem Produktivserver auftritt.
DBCC
In solchen Fällen gibt es mehrere DBCC-Befehle, mit denen Sie beim Ausführen die Tempdb verkleinern können. Wenn Sie Skripte eingerichtet haben, um die Tempdb-Größe proaktiv zu überwachen, können Sie mit diesem Skript die Füllstoffe von Tempdb ermitteln. Ab sofort wird dieses Skript auf allen Verbindungsservern ausgeführt. Sie können es einfach steuern, indem Sie eine where-Klausel einfügen. Sie können festlegen, dass das Skript nur ausgeführt wird, wenn ein Problem mit Ihrer Tempdb vorliegt. In der Tabelle @Tserver werden alle Namen Ihrer Verbindungsserver gespeichert. Für eine Tempdb-Datenbank SQL-Beschädigung würde den Status der Datenbank als SUSPECT ändern und dies wird unterbrechen SQL Server Service von Anfang an.
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
Einführung des Autors:
Neil Varley ist ein Experte für Datenwiederherstellung in DataNumen, Inc., das weltweit führend bei Datenwiederherstellungstechnologien ist, einschließlich Outlook wiederherstellen und Excel-Wiederherstellungssoftwareprodukte. Für weitere Informationen besuchen Sie www.datanumen.com €XNUMX