automatizar a página DBCC

desde 2006, Paul Randal documentou a página DBCC em seu blog Microsoft em https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. Em seu post, você vai notar que, a fim de retornar a saída da página DBCC para a tela, você precisa permitir trace flag 3604 primeiro. O post acima mostra alguns exemplos dos resultados e utilizando-os para outras ações. Infelizmente, este método requer intervenção manual para obter os dados necessários a partir da página, a fim de trabalhar com ele ainda mais.

você sabe, certamente seria bom se a intervenção manual pudesse ser removida e automatizar completamente a tarefa que você está procurando. Este post do blog vai mostrar-lhe como isso pode ser feito, e ele vai dar alguns exemplos de fazê-lo.

no meu último post no blog, introduzi uma configuração opcional a vários comandos DBCC: com resultados de TABLERESULTS. Isto devolve a saída em formato tabular, de uma forma que permite que a saída seja consumida. Como acontece, esta configuração opcional também funciona com a página DBCC. Você pode ver isso examinando as informações do banco de dados de página (página 9) do banco de dados mestre:

código-Fonte
DBCC PAGE ('master', 1, 9, 3) COM TABLERESULTS;

Esta declaração, que pode ser executado sem o sinalizador de rastreamento, retorna os dados na página em 4 colunas: ParentObject, Objeto, Campo e VALOR. Como acontece, esta página em particular de cada banco de dados tem um monte de informações interessantes sobre ele. Vamos automatizar agarrando um conjunto específico de informações para fora desta página:

código-Fonte
SE OBJECT_ID('tempdb.dbo.#DBCCPAGE') NÃO É NULO DROP TABLE #DBCCPAGE;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Campo VARCHAR(255), VARCHAR(255));INSERT INTO #DBCCPAGEEXECUTE ('DBCC PAGE ("mestre", 1, 9, 3) COM TABLERESULTS;'); SELECT LastGoodDBCCDate = CONVERTER(data / hora, VALOR)DO #DBCCPAGEWHERE Campo = 'dbi_dbccLastKnownGood';

este excerto maravilhoso de código retorna a última vez que um CHECKDB DBCC bem sucedido foi executado com base de dados mestre. Não é querido? Quando você descobrir um servidor onde a tarefa CHECKDB tem falhado ao ponto de que a tarefa só falhou entradas no histórico de tarefas, você pode agora descobrir quanto tempo passou desde que foi executado com sucesso pela última vez.

o “truque” para fazer este trabalho é encapsular o comando DBCC como uma string, e chamá-lo com a função EXECUTE (). Isto é usado como parte de uma declaração inserir / executar, de modo que os resultados da página DBCC são inseridos em uma tabela (neste caso, uma tabela temporária é usada, embora uma tabela variável ou tabela permanente também pode ser usado). Há três passos simples para este processo:

  1. crie uma tabela (permanente / temporária) ou variável tabela para manter a saída.
  2. inserir nesta tabela os resultados da declaração de página DBCC usando inserir / executar.
  3. Seleccione os dados que procura na tabela.

ao utilizar um cursor, você pode facilmente girar através de todas as bases de dados em sua instância para obter quando eles tiveram a última vez um sucesso DBCC CHECKDB executado contra eles. O seguinte utiliza sp_MSforeachdb (que se usa um cursor para girar através de todos os bancos de dados) para fazer apenas este:

código-Fonte
SE OBJECT_ID('tempdb.dbo.#DBCCPAGE') não é a tabela nula #DBCCPAGE; se OBJECT_ID ('tempdb.dbo.# CheckDBDates') não é Tabela 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;

e aqui temos todas as bases de dados da sua instância, e a data em que o DBCC CHECKDB foi executado com sucesso pela última vez contra ele – bem, pelo menos para as bases de dados que o sp_MSforeachdb não ignorou (veja https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ para mais informações sobre isso).

em resumo, utilizando a opção “WITH TABLERESULTS” do DBCC, podemos automatizar processos que usam a página DBCC, em vez de precisar de intervenção manual para trabalhar o seu caminho através disto.

nas próximas parcelas, vamos olhar para outros usos de usar “WITH TABLERESULTS” para automatizar a saída de DBCC.

Deixe uma resposta

O seu endereço de email não será publicado.