ORACLE: ORA-01578: ORACLE data block corrupted (file # 64, block # 128974)
- Siltech Consult
- 8 de out. de 2019
- 3 min de leitura
Tive um problema nesta semana que basicamente tomou grande parte da semana. Não pela dificuldade em resolver, mas pela demora que é o processo de resolução.
Cliente relatou o seguinte problema:
Se tem um erro que preocupa qualquer DBA é erro de blocos corrompidos, pelo simples fato de que a solução, geralmente envolve apenas uma ação: VOLTAR BACKUP.
O problema de voltar backup não é a ação em si, mas sim, o fato que, geralmente a responsabilidade de fazer o backup e gravá-lo em fita nem sempre é do próprio DBA e sim de outra pessoa.
No meu caso, infelizmente não escapei desta regra. Pedi o último backup e a resposta que tive foi: Faz uma semana que não colocamos nova fita no drive. Ótimo. Vamos ver o que consigo fazer e segue aí um how to pra você que tiver a mesma dificuldade:
1) Busque nos traces, alert do banco, user_dump_dest, background_dump_dest e outras áreas quais blocos estão corrompidos e principalmente desde quando este erro tem ocorrido. Pense bem: se o bloco está corrompido nós não vamos conseguir recuperar este bloco, a única solução é voltar backup, então, você deve mapear DESDE quando o erro esta ocorrendo para ver qual backup você irá precisar. No caso do exemplo abaixo, a base era monitorada, então este foi o primeiro erro que ela teve. Pelo fato de não terem backup recente em fita, optamos por tentar recuperar o máximo de informação possível, desta mesma base.
2) Seria interessante fazer uma análise no HW usado, nos discos ou na controladora. O bloco pode ter se corrompido logicamente (pelo SO ou no momento de um restart da máquina enquanto o banco estava online) ou o que é mais frequente pode ser um problema de Hardware. No meu caso (e se este for o seu caso) o fornecedor do Hardware não identificou onde estava o problema (a máquina re-iniciou e tiveram trabalho para a mesma subir novamente) e é lógico que a minha ação foi solicitar novo hardware logo após conseguir realizar a recuperação desta base.
3) De posse das informações do ítem 1 (datafile e bloco que estão corrompidos) execute o script abaixo para CADA grupo datafile/bloco que foi identificado:
4) O SQL acima, irá identificar de qual segmento este bloco faz parte. Se for apenas um índice: basta recriá-lo. Se for tabela (o que era o meu caso) o procedimento é um pouco mais complexo.
4.1) Crie tabela do DBMS_REPAIR:
4.2) Crie a Orphan Key (pode ser necessário):
4.3) Nas tabelas identificadas no ítem 3, liste os blocos problemáticos:
4.4) Se quiser, vc pode listar quais são estes blocos e o motivo deles terem sido corropidos:
4.5) Caso queira, é possível listar (pelo PK, se ela não estiver corrompida) quais são os registros filhos que serão afetados:
4.6) Agora, devemos marcar na tabela corrompida, quais blocos estão corrompidos:
4.7) Feita a marcação, devemos orientar o Oracle à `pular` na leitura os registros que estão corrompidos:
4.8) Todos os índices que fazem parte desta tabela devem ser reorganizados (rebuild), pois caso contrário, podemos ter problemas na leitura dos mesmos.
5) Infelizmente a maior parte dos DBAs para nesta etapa. O que é um sério erro. O que deve ser feito neste momento é um backup desta tabela, DROP desta tabela corrompida, CREATE de uma nova e import do backup. Pode-se inclusive usar o CREATE as SELECT com posterior DROP da antiga e RENAME da nova para o nome correto. O importante é não deixarmos a tabela com blocos corrompidos sendo usada ainda.
OBS: No caso do exemplo que tive nesta semana, foram perdidos 2 blocos desta tabela (a mesma tinha 40 milhões de registros) e neste dois blocos tínhamos 32 registros apenas, que foram identificados através da análise da orphan key.
Dúvidas? silverio@siltechconsult.com.br

Comentários