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

Advertisements

About Marcos Freccia

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

Posted on September 9, 2013, in DBCC, SQL Server Internals, VirtualPass and tagged , , , . Bookmark the permalink. 2 Comments.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: