Kui teie temp DB andmebaas SQL Server ruum saab otsa, võib see põhjustada suuri häireid teie tootmiskeskkonnas ja katkestada kasutajarakenduste eduka lõpetamise. Kui kasutate ajutise DB suuruse jälgimiseks skripti, lisage ajutise DB täitmise algpõhjuse tuvastamiseks selle artikli skript.
Tempdb täis – tavaline stsenaarium
Halvasti kirjutatud päringud võivad luua mitu ajutist objekti, mille tulemuseks on tempdb andmebaasi kasvamine. See annab tulemuseks kettaruumi hoiatusi ja võib põhjustada serveriprobleeme. Kui neid on palju SQL Server Kui andmebaasi administraatoritel on tempdb-d väga raske vähendada, otsustavad nad kohe serveri taaskäivitamise. Kui olete proovinud kõiki tempdb andmebaasi vähendamise meetodeid ja see ikka ei vähene, on viimane võimalus SQL-teenuse taaskäivitamine konfiguratsioonihalduri kaudu. Seega lakkavad teie kettaruumi hoiatused ja ka serveriprobleemid. Tempdb taaskäivitamine ei pruugi aga teile saadaval olla, kui probleem tekkis tootmisserveris.
DBCC
Sellistel juhtudel on mitu DBCC käsku, mille käivitamine võimaldab teil tempdb-d kahandada. Kui olete seadistanud skripte tempdb suuruse proaktiivseks jälgimiseks, saate seda skripti kasutada tempdb täiteainete leidmiseks. Praeguse seisuga käivitataks see skript kõigis lingitud serverites. Saate seda hõlpsalt juhtida, lisades kuhu-klausli. Skripti saab käivitada ainult siis, kui tempdb-ga on probleeme. Tabelit @Tserver kasutatakse kõigi teie lingitud serverinimede salvestamiseks. Tempdb andmebaasi jaoks SQL-i korruptsioon muudaks andmebaasi oleku KAHTLUSEKS ja see katkestab SQL Server teenus algusest peale.
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
Autori sissejuhatus:
Neil Varley on andmete taastamise ekspert DataNumen, Inc., mis on maailmas juhtiv andmete taastamise tehnoloogiate, sealhulgas Outlooki taastamine ja Exceli taastamise tarkvaratooted. Lisateabe saamiseks külastage www.datanumenCom