Če vaša začasna baza podatkov DB SQL Server zmanjka prostora, lahko povzroči velike motnje v vašem produkcijskem okolju in lahko prekine uspešno dokončanje uporabniških aplikacij. Če uporabljate skript za sledenje velikosti začasne baze podatkov, dodajte skript iz tega članka, da ugotovite glavni vzrok za polnjenje začasne baze podatkov.
Tempdb poln – pogost scenarij
Slabo napisane poizvedbe lahko ustvarijo več začasnih objektov, kar povzroči naraščajočo bazo podatkov tempdb. To bo povzročilo opozorila o prostoru na disku in težave s strežnikom. Ko je veliko SQL Server Skrbniki baz podatkov imajo zelo težave s krčenjem tempdb, zato se takoj odločijo za ponovni zagon strežnika. Če bi poskusili vse metode za krčenje tempdb in se ta še vedno ne krči, je zadnja možnost ponovni zagon storitve SQL prek upravitelja konfiguracije. Tako bi se opozorila o prostoru na disku ustavila in težave s strežnikom bi se prav tako ustavile. Vendar pa ponovni zagon tempdb morda ne bi bil na voljo, če bi se težava pojavila na produkcijskem strežniku.
DBCC
V takšnih primerih obstaja več ukazov DBCC, ki bi vam ob zagonu omogočili skrčenje tempdb. Če ste nastavili skripte za proaktivno spremljanje velikosti tempdb, lahko s tem skriptom poiščete polnila tempdb. Od zdaj bi se ta skript izvajal na vseh povezanih strežnikih. Z lahkoto ga lahko nadzorujete tako, da vstavite klavzulo where. Skript lahko nastavite tako, da se izvede le, če pride do težave z vašo tempdb. Tabela @Tserver se uporablja za shranjevanje vseh vaših povezanih imen strežnikov. Za bazo podatkov tempdb, Korupcija SQL bi spremenil status baze podatkov v SUSPECT in to bo prekinjeno SQL Server storitev od začetka.
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
Uvod avtorja:
Neil Varley je strokovnjak za obnovitev podatkov v DataNumen, Inc., ki je vodilna na svetu na področju tehnologij za obnovitev podatkov, vključno z obnoviti Outlook in excel programske izdelke za obnovitev. Za več informacij obiščite www.datanumen.com