Como solucionar problemas de consistência de banco de dados reportados por DBCC CHECKB
Este artigo explica como solucionar erros relatados pelo DBCC CHECKDB
comando.
Versão original do produto: SQL Server
Número original da base de conhecimento: 2015748
Sintomas
Quando o DBCC CHECKDB (ou outros comandos semelhantes, como DBCC CHECKTABLE) é executado, uma mensagem como a seguinte é gravada no log de erros do SQL Server:
DBCC CHECKDB (mydb) executed by MYDOMAIN\theuser found 15 errors and repaired 3 errors.
Elapsed time: 0 hours 0 minutes 0 seconds.
Internal database snapshot has split point LSN = 00000026:0000089d:0001 and first LSN = 00000026:0000089c:0001.
This is an informational message only. No user action is required.
Esta mensagem mostra quantos erros de consistência de banco de dados foram encontrados e quantos foram reparados, se uma opção de reparo foi usada. Essa mensagem também é gravada no Log de Eventos do Aplicativo Windows como uma mensagem de nível de informação com EventID=8957. Mesmo que erros sejam relatados, essa mensagem é uma mensagem de nível de informação.
As informações na mensagem que começa com "instantâneo do banco de dados interno..." só aparece se DBCC CHECKDB
tiver sido executado online, no qual o banco de dados não está no SINGLE_USER
modo. Isso ocorre porque, para um on-line DBCC CHECKDB
, um instantâneo de banco de dados interno é usado para apresentar um conjunto consistente de dados a serem verificados.
Este artigo não discute como solucionar cada erro específico relatado por DBCC CHECKDB
, mas sim a abordagem geral se os erros forem relatados. Qualquer referência a CHECKDB
neste artigo também se aplica a DBCC CHECKTABLE
e DBCC CHECKFILEGROUP, a menos que indicado.
Motivo
O DBCC CHECKDB
comando verifica a consistência física e lógica de páginas de banco de dados, linhas, páginas de alocação, relações de índice, integridade referencial da tabela do sistema e outras verificações de estrutura. Se alguma dessas verificações falhar (dependendo das opções escolhidas), os erros serão relatados.
A causa desses problemas pode variar de corrupção do sistema de arquivos, problemas subjacentes do sistema de hardware, problemas de driver, páginas corrompidas na memória ou no cache de armazenamento ou problemas com o SQL Server. Para obter informações sobre como identificar a causa raiz dos erros relatados, consulte Investigar a causa raiz.
Resolução
Resolva quaisquer problemas subjacentes relacionados ao hardware no sistema antes de prosseguir com a restauração de um backup ou reparar o banco de dados. Aplique todas as atualizações de driver de dispositivo, firmware, BIOS e sistema operacional relevantes para o caminho de E/S. Trabalhe com o administrador do caminho de E/S completo (computador local, drivers de dispositivo, NICs de armazenamento, SAN, armazenamento de back-end e cache) para isolar e resolver quaisquer problemas. Os exemplos incluem a atualização de drivers de dispositivo e a verificação da configuração de todo o caminho de E/S. Para obter mais informações sobre como verificar a causa raiz, consulte Investigar a causa raiz.
Se
DBCC CHECKDB
o relatar erros de consistência permanentes, a melhor solução seria restaurar os dados de um backup em boas condições. Para obter mais informações, consulte Restauração e recuperação.Aplique a atualização cumulativa ou o Service Pack mais recente do SQL Server para garantir que você não esteja enfrentando problemas conhecidos. Verifique a documentação da Atualização Cumulativa ou do Service Pack para ver se há problemas conhecidos corrigidos relacionados à corrupção do banco de dados (erros de consistência) e aplique as correções relevantes. Um local central onde você pode pesquisar todas as correções para uma versão específica se as listas de correções detalhadas para SQL Server 2022, 2019, 2017.
Se os
DBCC CHECKDB
erros forem intermitentes, ou seja, se eles aparecerem em uma execução e desaparecerem na próxima, você pode estar enfrentando problemas de cache de disco (driver de dispositivo ou outro problema de caminho de E/S). Trabalhe com os mantenedores do caminho de E/S para isolar e resolver quaisquer problemas. Os exemplos incluem a atualização de drivers de dispositivo, a verificação da configuração de todo o caminho de E/S e a atualização do firmware e do BIOS nos dispositivos e no sistema do caminho de E/S.Se não for possível restaurar a partir de um backup,
CHECKDB
tem um recurso para reparar erros que você pode usar. Existem dois níveis de reparo:REPAIR_REBUILD
- Realiza reparos que não têm possibilidade de perda de dados.REPAIR_ALLOW_DATA_LOSS
- Realiza reparos que têm a possibilidade de perda de dados.
Para obter mais informações, consulte a documentação do DBCC CHECKDB.
Você deve ter cuidado ao optar por reparar com permitir perda de dados, pois isso pode deixar seu banco de dados em um estado logicamente inconsistente. A
DBCC CHECKDB
saída faz uma recomendação sobre o nível mínimo de reparo a ser usado. É uma prática comum executarCHECKDB
váriasREPAIR_ALLOW_DATA_LOSS
vezes até que não sejam relatados mais erros. Isso ocorre porque, quando o reparo corrige um conjunto de erros, outras ligações quebradas podem ser descobertas. No entanto, novos erros podem aparecer se a causa subjacente não tiver sido resolvida. Portanto, se problemas no nível do sistema, como hardware ou sistema de arquivos, estiverem causando corrupção de dados, esses problemas devem ser resolvidos primeiro, antes da restauração de um backup ou reparo. Os engenheiros de suporte da Microsoft não podem ajudar na recuperação física de dados corrompidos se o reparo não corrigir os erros de consistência ou se o backup do banco de dados estiver corrompido.Quando você executa
DBCC CHECKDB
o , é fornecida uma recomendação para indicar a opção de reparo mínima necessária para reparar todos os erros. Essas mensagens são semelhantes à seguinte saída:O CHECKDB encontrou 0 erros de alocação e 15 erros de consistência no banco de dados 'mydb'.
REPAIR_ALLOW_DATA_LOSS
é o nível mínimo de reparo para os erros encontrados porDBCC CHECKDB
(mydb).A recomendação de reparo é o nível mínimo de reparo para tentar resolver todos os erros do
CHECKDB
. O nível mínimo de reparo não significa que essa opção de reparo corrija todos os erros. Alguns erros simplesmente não podem ser corrigidos. Além disso, pode ser necessário executar o processo de reparo mais de uma vez. Nem todos os erros relatados exigem o uso desse nível de reparo para serem resolvidos. Isso significa que nem todos os reparos resultamCHECKDB
REPAIR_ALLOW_DATA_LOSS
em perda de dados. O reparo deve ser executado para determinar se a resolução de um erro resulta em perda de dados. Uma técnica para ajudar a restringir qual é o nível de reparo para cada tabela é usarDBCC CHECKTABLE
para qualquer tabela que relate um erro. Isso mostra o nível mínimo de reparo para uma determinada tabela.Aviso
Você deve executar a validação manual de dados após
CHECKDB
a conclusão do reparo ou da exportação ou importação de dados. Para obter mais informações, consulte Argumentos DBCC CHECKDB. Os dados podem não ser logicamente consistentes após o reparo. Por exemplo, reparar (particularmenteREPAIR_ALLOW_DATA_LOSS
a opção) pode remover páginas de dados inteiras que contêm dados inconsistentes. Nesses casos, uma tabela com uma relação de chave estrangeira com outra tabela pode acabar com linhas que não têm linhas de chave primária correspondentes na tabela pai.Tente criar um script para o esquema do banco de dados. Use o script para criar um novo banco de dados e, em seguida, use uma ferramenta como o Assistente de Exportação/Importação BCP ou SSIS para exportar o máximo possível de dados do banco de dados corrompido para o novo banco de dados. A exportação de dados de uma tabela corrompida provavelmente falhará. Nesses casos, pule esta tabela, vá para a próxima e salve o que puder.
Revise os artigos a seguir para ver se há erros específicos gerados por
DBCC CHECKDB
e siga as etapas fornecidas (se houver). Eis alguns exemplos:- Erro 605 (MSSQLSERVER_605)
- Erro 823 (MSSQLSERVER_823)
- Erro 824 (MSSQLSERVER_824)
- Erro 825 (MSSQLSERVER_825)
- Erro 2508 (MSSQLSERVER_2508)
- Erro 2511 (MSSQLSERVER_2511)
- Erro 2512 (MSSQLSERVER_2512)
- Erro 7987 (MSSQLSERVER_7987)
- Erro 7988 (MSSQLSERVER_7988)
- Erro 7995 (MSSQLSERVER_7995)
- Erro 8993 (MSSQLSERVER_8993)
- Erro 8994 (MSSQLSERVER_8994)
- Erro 8996 (MSSQLSERVER_8996)
Investigar a causa raiz dos erros de consistência do banco de dados
Para identificar a causa raiz dos erros de consistência do banco de dados, considere estes métodos:
- Verifique o Log de Eventos do Sistema do Windows para ver se há erros relacionados ao nível do sistema, driver ou disco e trabalhe com o fabricante do hardware para resolvê-los.
- Execute todos os diagnósticos fornecidos pelos fabricantes de hardware para o computador e/ou sistema de disco.
- Trabalhe com o fornecedor de hardware ou fabricante do dispositivo para garantir que:
- Os dispositivos de hardware e a configuração confirmam os requisitos de entrada/saída do mecanismo de banco de dados do Microsoft SQL Server.
- Os drivers de dispositivo e outros componentes de software de suporte de todos os dispositivos no caminho de E/S estejam atualizados.
- Considere usar um utilitário como o SQLIOSim na unidade em que residem os bancos de dados que relataram os erros de consistência. O SQLIOSim é uma ferramenta independente do SQL Server Engine para testar a integridade da E/S para o sistema de disco. O SQLIOSim é fornecido com o SQL Server e não requer um download separado. Ele pode ser encontrado na pasta \MSSQL\Binn .
- Verifique a documentação da Atualização Cumulativa ou do Service Pack para ver se há problemas conhecidos corrigidos relacionados à corrupção do banco de dados (erros de consistência) e aplique as correções relevantes. Um local central onde você pode pesquisar todas as correções para uma versão específica se as listas de correções detalhadas para SQL Server 2022, 2019, 2017.
- Verifique se há outros erros relatados pelo SQL Server, como violações de acesso ou asserções. A atividade em bancos de dados corrompidos frequentemente resulta em exceções de violação de acesso ou erros de declaração.
- Verifique se os bancos de dados estão usando a
PAGE_VERIFY CHECKSUM
opção. Se erros de soma de verificação estiverem sendo relatados, isso é uma indicação de que os erros de consistência ocorreram depois que o SQL Server gravou páginas no disco. Assim, seu subsistema de E/S deve ser verificado minuciosamente. Para obter mais informações sobre erros de soma de verificação, consulte Como solucionar problemas de Msg 824 no SQL Server. - Procure erros da mensagem 832 no ERRORLOG. Esses erros podem indicar que as páginas podem ser danificadas enquanto estão no cache antes de serem gravadas no disco. Para obter mais informações, consulte Como solucionar problemas de Msg 832 no SQL Server.
- Em outro sistema, tente restaurar um backup de banco de dados que você sabe que está "limpo" (sem erros de ) seguido por backups de log de
CHECKDB
transações que abrangem o tempo em que o erro foi gerado. Se você puder "recriar" esse problema restaurando um backup de banco de dados "limpo" e um backup de log de transações, entre em contato com o Suporte Técnico da Microsoft para obter assistência. - Os erros de Pureza de Dados podem ser um problema com o aplicativo inserindo ou atualizando dados inválidos em tabelas do SQL Server. Para obter mais informações sobre como solucionar erros de Pureza de Dados, consulte Solucionando problemas do erro DBCC 2570 no SQL Server 2005.
- Verifique a integridade do sistema de arquivos usando o comando chkdsk . Não execute
chkdsk
enquanto o SQL Server estiver em execução. Ele pode relatar erros de arquivo transitórios se o SQL Server estiver gravando nos arquivos que estão sendo verificados. Além disso, opções como/r
ou/f
podem mover bytes de arquivo para um local diferente no disco, e esse movimento pode levar à corrupção se o SQL Server também estiver gravando ou lendo esses arquivos. Portanto, certifique-se de interromper o SQL Server antes de executar ochkdsk
comando. Além disso, tenha cuidado com opções de reparo como/r
e/f
. Certifique-se de ter um backup de seus bancos de dados antes de executar um reparo, pois essas opções podem corromper os arquivos, se erros de disco forem encontrados pelochkdsk
.
Mais informações
Para obter detalhes sobre a sintaxe DBCC CHECKDB
e informações ou opções sobre como executar o comando, consulte DBCC CHECKDB (Transact-SQL).
Se algum erro for encontrado usando CHECKDB
o , outras mensagens semelhantes à seguinte mensagem serão relatadas no ERRORLOG para fins de relatório de erros:
**Dump thread - spid = 0, EC = 0x00000000855F5EB0
***Stack Dump being sent toFilePath\FileName
* ******************************************************************************
*
* BEGIN STACK DUMP:
* Date/Timespid 53
*
* DBCC database corruption
*
* Input Buffer 84 bytes -
* dbcc checkdb(mydb)
*
* *******************************************************************************
* -------------------------------------------------------------------------------
* Short Stack Dump
Stack Signature for the dump is 0x00000000000001E8
External dump process return code 0x20002001.
As informações de erro foram enviadas para o relatório de erros do Watson.
Os arquivos usados para relatório de erros incluem um arquivo SQLDump<nnn>.txt . Este arquivo pode ser útil para fins históricos, pois contém uma lista dos erros encontrados CHECKDB
em um formato XML.
Para descobrir a última vez DBCC CHECKDB
que foi executado sem erros detectados para um banco de dados (o último limpo CHECKDB
conhecido), verifique o SQL Server ERRORLOG. Procure uma mensagem como a seguinte para um banco de dados de usuário ou sistema. Essa mensagem também é gravada como uma mensagem de Nível de Informação no Log de Eventos do Aplicativo Windows com EventID = 17573):
Data/Hora spid7s CHECKDB para banco de dados 'mestre' concluído sem erros em Data/Hora22:11:11.417 (hora local). Esta é apenas uma mensagem informativa; Nenhuma ação do usuário é necessária