Jos temp DB-tietokantasi SQL Server Tila loppuu, se voi aiheuttaa suuria häiriöitä tuotantoympäristössäsi ja keskeyttää käyttäjäsovellusten onnistuneen valmistumisen. Jos käytät komentosarjaa väliaikaisen tietokannan koon seuraamiseen, liitä tämän artikkelin komentosarja tunnistaaksesi tilapäisen tietokannan täytön perimmäinen syy.
Tempdb täynnä – yleinen skenaario
Huonosti kirjoitetut kyselyt saattavat luoda useita väliaikaisia objekteja, mikä johtaa kasvavaan tempdb-tietokantaan. Tämä johtaa levytilahälytyksiin ja voi aiheuttaa palvelinongelmia. Kun useita SQL Server Tietokannan ylläpitäjät kokevat tempdb-tietokannan pienentämisen erittäin vaikeaksi, joten he valitsevat välittömästi palvelimen uudelleenkäynnistyksen. Jos olet kokeillut kaikkia menetelmiä tempdb-tietokannan pienentämiseksi eikä se vieläkään kutistu, viimeinen vaihtoehto on käynnistää SQL-palvelu uudelleen kokoonpanonhallinnan kautta. Näin levytilahälytykset ja palvelinongelmat loppuvat. Tempdb-tietokannan uudelleenkäynnistys ei kuitenkaan välttämättä ole käytettävissä, jos ongelma on ilmennyt tuotantopalvelimella.
DBCC
Tällaisissa tapauksissa on olemassa useita DBCC-komentoja, jotka ajettaessa mahdollistavat tempdb:n pienentämisen. Jos olet asettanut skriptejä valvomaan ennakoivasti tempdb:n kokoa, voit käyttää tätä komentosarjaa tempdb:n täyteaineiden löytämiseen. Tästä lähtien tämä komentosarja suoritettaisiin kaikilla linkitetyillä palvelimilla. Voit hallita sitä helposti lisäämällä where-lauseen. Voit asettaa komentosarjan suoritettavaksi vain, kun tempdb:ssä on ongelma. Taulukkoon @Tserver tallennetaan kaikki linkitetyt palvelinnimet. Tempdb-tietokanta SQL-korruptio muuttaisi tietokannan tilan epäilyttäväksi ja tämä keskeytyy SQL Server palvelua alusta alkaen.
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
Tekijän esittely:
Neil Varley on tietojen palauttamisen asiantuntija DataNumen, Inc., joka on maailman johtava tietojen palautustekniikoissa, mukaan lukien palauttaa Outlook ja Excel-palautusohjelmistotuotteet. Lisätietoja osoitteessa www.datanumen.com