Automatizzare la pagina DBCC

Nel lontano 2006, Paul Randal ha documentato la PAGINA DBCC sul suo blog Microsoft a https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. Nel suo post, noterai che per restituire l’output dalla PAGINA DBCC allo schermo, devi prima abilitare trace flag 3604. Il post sul blog sopra mostra alcuni esempi dei risultati e li utilizza per ulteriori azioni. Sfortunatamente, questo metodo richiede un intervento manuale per ottenere i dati necessari dalla pagina per lavorare ulteriormente con esso.

Sai, sicuramente sarebbe bello se l’intervento manuale potesse essere rimosso e automatizzare completamente il compito che stai cercando. Questo post sul blog ti mostrerà come questo può essere fatto, e darà alcuni esempi di farlo.

Nel mio ultimo post sul blog, ho introdotto un’impostazione opzionale per diversi comandi DBCC: CON TABLERESULTS. Questo restituisce l’output in formato tabulare, in modo che l’output possa essere consumato. A quanto pare, questa impostazione opzionale funziona anche con la pagina DBCC. Si può vedere esaminando le informazioni del database (pagina 9) del database master:

il codice Sorgente
DBCC PAGINA ('master', 1, 9, 3) with TABLERESULTS;

Questa affermazione, che può essere eseguito senza il flag di traccia, restituisce i dati sulla pagina in 4 colonne: ParentObject, Oggetto, Campo e VALORE. A quanto pare, questa particolare pagina di ogni database ha molte informazioni interessanti su di esso. Automatizziamo l’acquisizione di una specifica informazione da questa pagina:

Codice sorgente
SE OBJECT_ID ('tempdb.dbo.#DBCCPAGE') NON È NULL DROP TABLE #DBCCPAGE;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));INSERT INTO #DBCCPAGEEXECUTE ('DBCC PAGE ("master", 1, 9, 3) WITH TABLERESULTS;'); SELECT LastGoodDBCCDate = CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = 'dbi_dbccLastKnownGood';

Questo meraviglioso frammento di codice restituisce l’ultima volta che un DBCC CHECKDB è stato eseguito con successo contro il database master. Wow how quanto e ‘ dolce? Quando si scopre un server in cui il lavoro CHECKDB non è riuscito al punto che il lavoro ha solo voci non riuscite nella cronologia dei lavori, è ora possibile scoprire quanto tempo è passato da quando è stato eseguito con successo.

Il “trucco” per fare questo lavoro è incapsulare il comando DBCC come una stringa e chiamarlo con la funzione EXECUTE (). Viene utilizzato come parte di un’istruzione INSERT INTO / EXECUTE, in modo che i risultati della PAGINA DBCC vengano inseriti in una tabella (in questo caso viene utilizzata una tabella temporanea, sebbene sia possibile utilizzare anche una tabella variabile o una tabella permanente). Ci sono tre semplici passaggi per questo processo:

  1. Creare una tabella (permanente / temporanea ) o variabile tabella per contenere l’output.
  2. Inserire in questa tabella i risultati dell’istruzione DBCC PAGE utilizzando INSERT INTO / EXECUTE.
  3. Seleziona i dati che stai cercando dalla tabella.

Utilizzando un cursore, puoi facilmente scorrere tutti i database sulla tua istanza per ottenere l’ultima volta che hanno avuto un DBCC CHECKDB eseguito con successo contro di loro. Quanto segue utilizza sp_MSforeachdb (che a sua volta utilizza un cursore per scorrere tutti i database) per fare proprio questo:

Codice sorgente
SE OBJECT_ID ('tempdb.dbo.# DBCCPAGE') NON È NULL DROP TABLE # DBCCPAGE; SE OBJECT_ID ('tempdb.dbo.# CheckDBDates') NON È NULL DROP TABLE # 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;

E qui abbiamo tutti i database sulla tua istanza e la data in cui DBCC CHECKDB è stato eseguito con successo contro di esso – beh, almeno per i database che sp_MSforeachdb non ha saltato (vedi https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ per ulteriori informazioni su questo).

In sintesi, utilizzando l’opzione” WITH TABLERESULTS ” di DBCC, possiamo automatizzare i processi che utilizzano la PAGINA DBCC, invece di richiedere un intervento manuale per risolvere questo problema.

Nelle prossime puntate, esamineremo altri usi dell’uso di “WITH TABLERESULTS” per automatizzare l’output DBCC.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.