Automatisere DBCC-Side

Helt tilbake i 2006 dokumenterte Paul Randal DBCC-SIDE på Sin Microsoft-blogg på https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. I innlegget hans vil du legge merke til at for å returnere utdataene FRA DBCC-SIDEN til skjermen, må du først aktivere trace flag 3604. Ovennevnte blogginnlegg viser noen eksempler på resultatene og bruker dem til videre handlinger. Dessverre krever denne metoden manuell inngrep for å få de nødvendige dataene fra siden for å kunne jobbe med det videre.

Du vet, det ville sikkert være fint om manuell inngrep kunne fjernes og helt automatisere oppgaven du leter etter. Dette blogginnlegget skal vise deg hvordan dette kan gjøres, og det vil gi noen eksempler på å gjøre det.

i mitt siste blogginnlegg introduserte jeg en valgfri innstilling til flere dbcc-kommandoer: MED TABLERESULTS. Dette returnerer utdataene i tabellformat, på en måte som gjør at utdataene kan forbrukes. Som det viser seg, fungerer denne valgfrie innstillingen også MED DBCC-SIDEN. Du kan se dette ved å undersøke databaseinformasjonssiden (side 9) i hoveddatabasen:

Kildekode
DBCC SIDE ('master', 1, 9, 3) MED TABLERESULTS;

denne setningen, som kan kjøres uten sporingsflagget, returnerer dataene på siden i 4 kolonner: ParentObject, Object, Field and VALUE. Som det viser seg, har denne siden av hver database mye interessant informasjon om den. La oss automatisere gripe et bestemt stykke informasjon ut av denne siden:

Kildekode
HVIS OBJECT_ID ('tempdb.dbo.#DBCCPAGE') ER IKKE NULL DROP TABELL #dbccpage;OPPRETT TABELL #Dbccpage ( ParentObject VARCHAR(255), Varchar(255), Felt VARCHAR(255), VARCHAR(255));SETT INN I #DBCCPAGEEXECUTE ('dbcc SIDE ("master", 1, 9, 3) MED TABLERESULTS;'); VELG LastGoodDBCCDate = KONVERTER(DATETIME, VERDI)FRA # DBCCPAGEWHERE FIELD = 'DBI_DBCCLASTKNOWNGOOD';

Denne fantastiske kodebiten returnerer sist gang en vellykket DBCC CHECKDB ble kjørt mot hoveddatabasen. Hvor søtt er ikke det? Når du oppdager en server DER CHECKDB jobben har vært sviktende til det punktet at jobben bare har mislyktes oppføringer i jobben historie, kan du nå finne ut hvor lenge det har vært siden det sist ble kjørt vellykket.

«trikset» for å gjøre dette arbeidet er å innkapsle dbcc-kommandoen som en streng, og å kalle den MED EXECUTE () – funksjonen. Dette brukes som en DEL AV EN INSERT INTO / EXECUTE-setning, slik at resultatene fra DBCC-SIDEN settes inn i en tabell (i dette tilfellet brukes en midlertidig tabell, selv om en tabellvariabel eller permanent tabell også kan brukes). Det er tre enkle trinn til denne prosessen:

  1. Opprett en tabell (permanent / midlertidig) eller tabellvariabel for å holde utdataene.
  2. Sett inn i denne tabellen resultatene AV DBCC-sideuttalelsen VED HJELP AV SETT INN I / UTFØR.
  3. Velg dataene du leter etter fra tabellen.

ved å bruke en markør, kan du enkelt spinne gjennom alle databasene på forekomsten din for å få når de sist hadde en vellykket DBCC CHECKDB løp mot dem. Følgende benytter sp_MSforeachdb (som selv bruker en markør til å spinne gjennom alle databasene) for å gjøre nettopp dette:

Kildekode
HVIS OBJECT_ID ('tempdb.dbo.#DBCCPAGE') ER IKKE NULL SLIPP TABELL #DBCCPAGE;HVIS OBJECT_ID ('tempdb.dbo.# CheckDBDates') ER IKKE NULL DROP TABELL #CheckDBDates;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));CREATE TABLE #CheckDBDates ( database_name sysname, LastCheckDB DATETIME); EXECUTE sp_MSforeachdb 'TRUNCATE TABLE #DBCCPAGE;INSERT INTO #DBCCPAGE EXECUTE (''DBCC PAGE (''''?'''', 1, 9, 3) WITH TABLERESULTS;'');INSERT INTO #CheckDBDatesSELECT ''?'', CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = ''dbi_dbccLastKnownGood'';'; SELECT database_name, LastCheckDBFROM #CheckDBDates;

og her har vi hver database på forekomsten din – og datoen DA DBCC CHECKDB sist ble kjørt vellykket mot det-vel, i hvert fall for databasene som sp_MSforeachdb ikke hoppet over (se https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ for mer informasjon om dette).

oppsummert, ved å benytte» MED TABLERESULTS » – alternativet TIL DBCC, kan vi automatisere prosesser som bruker DBCC-SIDEN, i stedet for å trenge manuell inngrep for å jobbe deg gjennom dette.

i de neste delene ser vi på andre bruksområder for å bruke «MED TABLERESULTS» for å automatisere dbcc-utdata.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.