Restauramos um backup em um novo banco de dados. Depois de executar algumas consultas de exclusão, recebemos a seguinte mensagem:
Msg 824, Nível 24, Estado 2, Linha 1 O SQL Server detectou um erro de E/S baseado em consistência lógica:...
Executei o DBCC checkdb e vi várias linhas, como:
Msg 2576, Level 16, State 1, Line 1
The Index Allocation Map (IAM) page (0:0) is pointed to by the previous pointer of IAM page (1:783) in object ID 0, index ID -1, partition ID 0, alloc unit ID 72057599497994240 (type Unknown), but it was not detected in the scan.
e
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 2083043448, index ID 1, partition ID 72057608168079360, alloc unit ID 72057608304721920 (type LOB data), page (1:307605). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed. Values are 12716041 and -4.
Msg 8965, Level 16, State 1, Line 1
Table error: Object ID 2083043448, index ID 1, partition ID 72057608168079360, alloc unit ID 72057608304721920 (type LOB data). The off-row data node at page (1:307605), slot 0, text ID 1368915968 is referenced by page (1:307603), slot 0, but was not seen in the scan.
Msg 8965, Level 16, State 1, Line 1
Table error: Object ID 2083043448, index ID 1, partition ID 72057608168079360, alloc unit ID 72057608304721920 (type LOB data). The off-row data node at page (1:307605), slot 1, text ID 903086080 is referenced by page (1:307648), slot 0, but was not seen in the scan.
Msg 8929, Level 16, State 1, Line 1
Object ID 2083043448, index ID 1, partition ID 72057608168079360, alloc unit ID 72057609480241152 (type In-row data): Errors found in off-row data with ID 1368915968 owned by data record identified by RID = (1:43506:13)
Msg 8929, Level 16, State 1, Line 1
Object ID 2083043448, index ID 1, partition ID 72057608168079360, alloc unit ID 72057609480241152 (type In-row data): Errors found in off-row data with ID 903086080 owned by data record identified by RID = (1:102876:38)
A seção final da saída foi:
CHECKDB found 1 allocation errors and 12 consistency errors in database 'Clients'.
repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (Clients).
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Minha pergunta é: devo tentar restaurar o banco de dados novamente ou prosseguir com a tentativa de reparo? Só hesito porque é um banco de dados bastante grande e a restauração demora um pouco.
ATUALIZAÇÃO: um pouco mais de informação.
Todos os erros de tabela estão relacionados a uma única tabela que eu poderia simplesmente descartar e recriar. No entanto, não entendo o que realmente significa o erro IAM ou seu impacto.
Eu provavelmente faria as duas coisas, mas restauraria para um novo nome.
Se os dados nessa tabela realmente não importam, e você pode realmente descartar e recriar a tabela, essa é provavelmente a opção mais rápida. Especialmente porque "repair_allow_data_loss" provavelmente causará perda de dados, sim.
Quanto ao significado do erro IAM:
Versão curta: as entranhas da sua mesa estão corrompidas.
Versão mais longa: O mapa de alocação de índice informa ao SQL Server onde obter os objetos reais. Nesse caso, com base nas referências a RIDs, suponho que seja uma tabela sem um índice clusterizado (em outras palavras, um heap) e que está informando ao SQL onde obter os dados que foram atualizados ativamente dentro do heap. (Uma das coisas que acontece quando um heap tem atualizações é que, se as novas informações não couberem no espaço antigo, é criado um ponteiro que informa ao SQL onde obter as novas informações.)
Aqui está um artigo sobre páginas IAM, e aqui está um bom vídeo sobre heaps no SQL Server que surgiu quando eu estava procurando por informações IAM para você.