Possible Index Corruption. Diagnosticando o problema

Olá pessoal,

Estou a algum tempo sem escrever nada tecnico e essa semana me deparei com um problema um tanto quanto chato, porem acho que será de extrema importancia relatar ele aqui para todos. Com certeza devemos ter outras referencias na web, então aqui será apenas mais uma fonte.

Problema

Sexta-feira 18:00 recebo o seguinte e-mail do SQL Server: “Possible index corruption detected. Run DBCC CHECKDB.” Entretanto um erro um tanto quanto estranho, já que o error id era 9100 e não os famosos 823 e 824.

O pior de tudo isso era o problema não retratar em qual base de dados o erro se encontrava. Fiz uma pequena pesquisa no connect e encontrei essa sugestão, e peço que todos votem na mesma.

Improve Error Message Quality : 9100 Possible index corruption detected. Run DBCC CHECKDB

Passos para descobrir o problema

Qualquer DBA que se preze irá rodar o seguinte comando: DBCC CHECKDB(DatabaseName) WITH NO_INFOMSGS, ALL_ERRORMSGS.

O problema foi que não foi encontrado nenhum erro em todas as bases de dados, e o erro não parava de aparecer.

Certo momento lembramos que 80% das bases que estavam naquela instancia, tinham sido migradas de SQL Server 2000 para SQL Server 2008 R2 e com isso uma palavra veio na mente DATA_PURITY. Começamos a rodar o DBCC CHECKDB(DatabaseName) WITH DATA_PURITY, NO_INFOMSGS,ALL_ERRORMSGS e assim conseguimos descobrir o seguinte erro em uma das bases.

image

Assim conseguimos descobrir aonde estava o possivel corrompimento. Para aqueles que querem entender mais sobre o DATA_PURITY e o porque desse problema, é só clicarem nos links que estão acima.

Quais os registros afetados?

Como vocês podem ver na imagem do erro acima, o SQL Server mostra exatamente as paginas de dados afetadas pelo problema. Como temos a pagina de dados o troubleshooting fica muito mais facil, pois temos em nossa mão o DBCC PAGE.

Para saber mais sobre o DBCC PAGE, leia esse post no hyperlink escrito por Paul Randal na epoca em que ele estava no time de Storage Engine. Basicamente nosso trabalho agora se resumiria a encontrar quais os registros afetados e realizar um UPDATE para ajustar a coluna com um valor satisfatorio.

Primeiramente para utilizar o DBCC PAGE temos que ativar a TRACE FLAG 3604 que faz os comandos executados serem retornados para a ferramenta que está executando a mesma.

DBCC TRACEON(3604,-1)

DBCC PAGE(<DatabaseName>,FileID,DataPageID,3)

Para aqueles que perguntam o porque do valor “3”. O mesmo faz retornar alem do page header da pagina de dados, também retorna todos os registros inserido dentro da pagina de dados detalhadamente. Com isso, conseguiriamos retornar exatamente qual o registro apresentando o problema. Abaixo segue uma saida do comando DBCC PAGE.

image

Acima temos a indicação de um novo registro inserido. Para simplemente achar o campo com problemas, faça uma pesquisa por “Invalid” e vocês terão o resultado abaixo.

image

Como podemos ver os campos que estão com valores invalido, possuirão a seguinte entrada “Invalid Column Value”.

Como resolver o problema

Uma vez que você possui os registros danificados, segue a abordagem que tive para resolver o problema.

1) Criar uma lista no Excel onde cada aba seria uma tabela.

2) Detro dessa tabela, pegaria os campos que fazem parte da primary key. Partindo do principio que eles serão unicos, eu saberei exatamente onde realizar o update.

3) Pegar os valores dos campos da primary key e criar uma clausula UPDATE para atualizar os registros invalidos onde a clausula WHERE será os campos da minha chave primaria.

Pessoal, o post de hoje era isso, esperam que tenham gostado e que seja de extrema valia para alguem.

Marcos Freccia

Sobre Marcos Freccia

MVP em SQL Server (Data Plataform) , especialista em SQL Server, e atualmente trabalhando com Microsoft Azure!

Publicado em setembro 9, 2013, em DBCC, SQL Server Internals, VirtualPass e marcado como , , , . Adicione o link aos favoritos. 2 Comentários.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: