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.
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.
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.
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
Posted on September 9, 2013, in DBCC, SQL Server Internals, VirtualPass and tagged DBCC PAGE, Error 9100, Possible index corruption detected. Run DBCC CHECKDB, SQL Server. Bookmark the permalink. 2 Comments.
Ótimo dica/post! Vlw
Pingback: Análise de um banco de dados corrompido | Alex Souza