Automatización de la página de DBCC

En 2006, Paul Randal documentó la página de DBCC en su blog de Microsoft en https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. En su publicación, notará que para devolver la salida de la PÁGINA DBCC a la pantalla, primero debe habilitar la bandera de seguimiento 3604. La publicación de blog anterior muestra algunos ejemplos de los resultados y los utiliza para acciones posteriores. Desafortunadamente, este método requiere intervención manual para obtener los datos necesarios de la página con el fin de seguir trabajando con ella.

Ya sabes, seguramente sería bueno si la intervención manual pudiera eliminarse y automatizar completamente la tarea que estás buscando. Esta publicación de blog te mostrará cómo se puede hacer esto, y te dará algunos ejemplos de cómo hacerlo.

En mi última entrada de blog, introduje una configuración opcional para varios comandos de DBCC: CON RESULTADOS DE TABLA. Esto devuelve la salida en formato tabular, de una manera que permite que la salida se consuma. Resulta que esta configuración opcional también funciona con la PÁGINA DBCC. Puede ver esto examinando la página de información de la base de datos (página 9) de la base de datos maestra:

Código fuente
PÁGINA DBCC ('master', 1, 9, 3) CON RESULTADOS DE TABLA;

Esta instrucción, que se puede ejecutar sin el indicador de seguimiento, devuelve los datos de la página en 4 columnas: Objeto, Objeto, Campo y VALOR. Resulta que esta página en particular de cada base de datos tiene mucha información interesante. Automaticemos la obtención de una información específica de esta página:

Código fuente
IF OBJECT_ID ('tempdb.dbo.#DBCCPAGE') NO ES UNA TABLA DE CAÍDA NULA #DBCCPAGE;CREAR TABLA #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Campo VARCHAR(255), VARCHAR(255));INSERTAR EN #DBCCPAGEEXECUTE ('DBCC PAGE ("master", 1, 9, 3) CON RESULTADOS DE TABLA;'); SELECCIONAR LastGoodDBCCDate = CONVERT(DATETIME, VALUE)DESDE #DBCCPAGEWHERE Field = 'dbi_dbccLastKnownGood';

Este maravilloso fragmento de código devuelve la última vez que se ejecutó correctamente una DBCC CHECKDB contra la base de datos maestra. ¿Qué tan dulce es eso? Cuando descubre un servidor en el que el trabajo CHECKDB ha estado fallando hasta el punto de que el trabajo solo ha fallado en las entradas del historial de trabajos, ahora puede averiguar cuánto tiempo ha pasado desde la última vez que se ejecutó correctamente.

El «truco» para hacer que esto funcione es encapsular el comando DBCC como una cadena, y llamarlo con la función EXECUTE (). Esto se usa como parte de una instrucción INSERT INTO / EXECUTE, de modo que los resultados de la PÁGINA DBCC se insertan en una tabla (en este caso se usa una tabla temporal, aunque también se puede usar una variable de tabla o una tabla permanente). Hay tres sencillos pasos para este proceso:

  1. Cree una tabla (permanente / temporal) o una variable de tabla para contener la salida.
  2. Inserte en esta tabla los resultados de la instrucción de página DBCC utilizando INSERT INTO / EXECUTE.
  3. Seleccione los datos que está buscando de la tabla.

Al utilizar un cursor, puede girar fácilmente a través de todas las bases de datos de su instancia para obtener la última vez que se ejecutó correctamente una DBCC CHECKDB en ellas. Lo siguiente utiliza sp_MSforeachdb (que a su vez usa un cursor para girar a través de todas las bases de datos) para hacer esto:

Código fuente
IF OBJECT_ID ('tempdb.dbo.#DBCCPAGE') NO ES UNA TABLA DE CAÍDA NULA # DBCCPAGE; SI OBJECT_ID ('tempdb.dbo.#CheckDBDates') NO ES UNA TABLA DE CAÍDA NULA #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;

Y aquí tenemos todas las bases de datos de su instancia, y la fecha en que DBCC CHECKDB se ejecutó con éxito por última vez en ella, bueno, al menos para las bases de datos que sp_MSforeachdb no omitió (consulte https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ para obtener más información al respecto).

En resumen, al utilizar la opción» CON RESULTADOS DE TABLA » de DBCC, podemos automatizar los procesos que usan la PÁGINA de DBCC, en lugar de necesitar intervención manual para abrirlo camino a través de esto.

En las próximas entregas, veremos otros usos del uso de» CON RESULTADOS DE TABLA » para automatizar la salida de DBCC.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.