O diagnóstico do SQL Server detecta problemas de E/S não relatados devido a leituras obsoletas ou gravações perdidas
Este artigo explica como o Diagnóstico do SQL Server ajuda a detectar problemas de entrada ou saída não relatados que ocorrem devido a leituras obsoletas ou gravações perdidas.
Versão original do produto: SQL Server
Número original do KB: 826433
Sintomas
Se problemas de sistema operacional, driver ou hardware causarem condições de gravação perdida ou leitura obsoleta no caminho de E/S, você poderá ver mensagens de erro relacionadas à integridade de dados, como erros 605, 823, 3448 e 3456 no SQL Server. Você pode receber mensagens de erro semelhantes aos exemplos a seguir:
2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.
Novos recursos de diagnóstico de E/S no SQL Server
O SQL Server introduziu novos recursos de diagnóstico de E/S a partir do SQL Server 2000 Service Pack 4 e esses diagnósticos fazem parte do produto desde então. Esses recursos são projetados para ajudar a detectar problemas relacionados a E/S externa e solucionar problemas das mensagens de erro descritas na seção Sintomas .
Se você receber qualquer uma das mensagens de erro listadas na seção Sintomas e elas não forem explicadas por um evento como uma falha de unidade física, examine todos os problemas conhecidos com o SQL Server, o sistema operacional, os drivers e o hardware. O diagnóstico tenta fornecer informações sobre as duas condições a seguir:
Gravação perdida: uma chamada bem-sucedida para a API WriteFile, mas o sistema operacional, um driver ou o controlador de cache não libera corretamente os dados para a mídia física, mesmo que o SQL Server seja informado de que a gravação foi bem-sucedida.
Leitura obsoleta: uma chamada bem-sucedida para a API ReadFile, mas o sistema operacional, um driver ou o controlador de cache retorna incorretamente uma versão mais antiga dos dados.
Para ilustrar, a Microsoft confirmou cenários em que uma chamada à API WriteFile retorna um status de êxito, mas uma leitura imediata e bem-sucedida do mesmo bloco de dados retorna dados mais antigos, incluindo dados que provavelmente estão armazenados em um cache de leitura de hardware. Às vezes, esse problema ocorre devido a um problema de cache de leitura. Em outros casos, os dados de gravação nunca são gravados no disco físico.
Como habilitar o diagnóstico
No SQL Server 2017 e versões posteriores, essa funcionalidade de diagnóstico é habilitada por padrão. No SQL Server 2016 e versões anteriores, esses diagnósticos só podem ser habilitados usando o sinalizador de rastreamento 818. Você pode especificar o sinalizador de rastreamento 818 como um parâmetro de inicialização, -T818, para a instância do SQL Server ou pode executar a seguinte instrução T-SQL para habilitá-los em runtime:
DBCC TRACEON(818, -1)
O sinalizador de rastreamento 818 habilita um buffer de anel na memória que é usado para acompanhar as últimas 2.048 operações de gravação bem-sucedidas executadas pelo computador que executa o SQL Server, não incluindo E/Ss de classificação e arquivo de trabalho. Quando ocorrem erros como 605, 823 ou 3448, o valor do LSN (número de sequência de log) do buffer de entrada é comparado à lista de gravação recente. Se o LSN recuperado durante a operação de leitura for mais antigo do que o usado na operação de gravação, uma nova mensagem de erro será registrada no log de erros do SQL Server. A maioria das operações de gravação do SQL Server ocorre como pontos de verificação ou como gravações lentas (uma gravação lenta é uma tarefa em segundo plano que usa E/S assíncrona). A implementação do buffer de anel é leve e o efeito de desempenho no sistema é insignificante.
Detalhes sobre a mensagem no log de erros
A mensagem a seguir não mostra nenhum erro explícito da API WriteFile ou da API ReadFile chama esse SQL Server. Em vez disso, ele mostra um erro de E/S lógico que resultou quando o LSN foi revisado e seu valor esperado não estava correto:
A partir do SQL Server 2005, a mensagem de erro exibida é:
O SQL Server detectou um erro de E/S baseado em consistência lógica: Leitura obsoleta. Ocorreu durante uma
<Read/Write>
página no ID<DBID>
do banco de dados no deslocamento<PHYSICAL OFFSET>
no arquivo<FILE NAME>
<PAGEID>
. Mensagens adicionais no log de erros ou no log de eventos do sistema no SQL Server poderão fornecer mais detalhes. Este é um erro grave que ameaça a integridade do banco de dados e deve ser corrigido imediatamente. Execute uma verificação de consistência completa do banco de dados (DBCC CHECKDB). Esse erro pode ser causado por muitos fatores. Para obter mais informações, consulte os Manuais Online do SQL Server.
Para obter mais informações sobre o erro 824, consulte MSSQLSERVER_824.
No momento em que relata esse erro, o cache de leitura contém uma versão mais antiga da página ou os dados não foram gravados corretamente no disco físico. Em ambos os casos (uma gravação perdida ou uma leitura obsoleta), o SQL Server relata um problema externo com o sistema operacional, o driver ou as camadas de hardware.
Se o erro 3448 ocorrer quando você tentar reverter uma transação que tenha o erro 605 ou 823, a instância do SQL Server fechará automaticamente o banco de dados e tentará abri-lo e recuperá-lo. A primeira página que apresenta o erro 605 ou 823 é considerada uma página inválida e a ID da página é mantida pelo computador que executa o SQL Server. Durante a recuperação (antes da fase de refazer), quando a ID de página incorreta é lida, os principais detalhes sobre o cabeçalho da página são registrados no log de erros do SQL Server. Essa ação é importante porque ajuda a distinguir entre cenários de Gravação Perdida e Leitura Obsoleta.
Comportamento observado com leituras obsoletas e gravações perdidas
Você pode ver os dois comportamentos comuns a seguir em cenários de leitura obsoleta:
Se os arquivos de banco de dados forem fechados e abertos, os dados corretos e gravados mais recentemente serão retornados durante a recuperação.
Quando você emite um ponto de verificação e executa a
DBCC DROPCLEANBUFFERS
instrução (para remover todas as páginas do banco de dados da memória) e, em seguida, executa aDBCC CHECKDB
instrução no banco de dados, os dados gravados mais recentemente são retornados.
Os comportamentos mencionados no parágrafo anterior indicam um problema de cache de leitura e são frequentemente resolvidos desabilitando o cache de leitura. As ações descritas no parágrafo anterior normalmente forçam uma invalidação de cache e as leituras bem-sucedidas que ocorrem mostram que a mídia física foi atualizada corretamente. O comportamento de gravação perdida ocorre quando a página lida ainda é a versão mais antiga dos dados, mesmo após uma liberação forçada dos mecanismos de cache.
Às vezes, o problema pode não ser específico de um cache de hardware. Pode ser um problema com um driver de filtro. Nesses casos, revise seu software, incluindo utilitários de backup e software antivírus, e veja se há problemas com o driver de filtro.
Descrição de vários cenários de leituras obsoletas e gravações perdidas
A Microsoft também observou condições que não atendem aos critérios do erro 605 ou 823, mas são causadas pela mesma atividade de leitura ou gravação perdida. Em alguns casos, uma página parece ser atualizada duas vezes, mas com o mesmo valor LSN. Esse comportamento pode ocorrer se a ID do objeto e a ID da página estiverem corretas (página já alocada para o objeto) e uma alteração for feita na página e liberada para o disco. A próxima recuperação de página retorna uma imagem mais antiga e, em seguida, uma segunda alteração é feita. O log de transações do SQL Server mostra que a página foi atualizada duas vezes com o mesmo valor LSN. Essa ação se torna um problema quando você tenta restaurar uma sequência de log de transações ou com problemas de consistência de dados, como falhas de chave estrangeira ou entradas de dados ausentes. A mensagem de erro a seguir ilustra um exemplo dessa condição:
Erro: 3456, Gravidade: 21, Estado: 1 Não foi possível refazer o registro de log (276666:1664:19), para ID de transação (0:825853240), na página (1:1787100), banco de dados 'autores' (7). Página: LSN = (276658:4501:9), tipo = 1. Log: OpCode = 4, contexto 2, PrevPageLSN: (275565:3959:31)..
Alguns cenários são descritos com mais detalhes nas listas a seguir:
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Table created or truncated
4 Inserts (Pages allocated)
5 Newly allocated page written to disk by Lazy Writer
6 Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7 Rollback of transaction initiated
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Page Modification
4 Page written to disk by Lazy Writer
5 Page read in for another modification (stale image returned)
6 Page Modified for a second time but because of stale image does not see first modification
7 Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page
Os operadores do SQL Server sort
executam atividades de E/S tempdb
, geralmente no banco de dados. Essas operações de E/S são semelhantes às operações de E/S de buffer; no entanto, eles já foram projetados para usar a lógica de repetição de leitura para tentar resolver problemas semelhantes. Os diagnósticos adicionais explicados neste artigo não se aplicam a essas operações de E/S.
A Microsoft observou que a causa raiz para as seguintes falhas de leitura de tipo geralmente é uma leitura obsoleta ou uma gravação perdida:
2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)
Como uma leitura obsoleta ou uma gravação perdida resulta em armazenamento de dados não esperado, uma ampla variedade de comportamentos pode ocorrer. Pode aparecer como dados ausentes, mas alguns dos efeitos mais comuns de dados ausentes aparecem como corrupções de índice, como o erro 644 ou 625:
Erro 644 Texto da mensagem de nível de gravidade 21 Não foi possível encontrar a entrada de índice para RID '%.*hs' na página de índice %S_PGID, ID de índice %d, banco de dados '%.*ls'.
Erro 625 Nível de gravidade 21 Texto da mensagem Não é possível recuperar a linha da página %S_PGID por RID porque o slotid (%d) não é válido.
Alguns clientes relataram linhas ausentes depois de realizar atividades de contagem de linhas. Esse problema ocorre devido a uma gravação perdida. Talvez a página devesse estar vinculada à cadeia de páginas de índice agrupadas. Se a gravação foi perdida fisicamente, os dados também serão perdidos.
Importante
Se você tiver algum dos comportamentos ou se suspeitar de problemas semelhantes com a desabilitação de mecanismos de cache, a Microsoft recomenda que você obtenha a atualização mais recente para o SQL Server. A Microsoft também recomenda que você execute uma revisão rigorosa do sistema operacional e das configurações associadas.
Observe que a Microsoft confirmou que, sob cargas de E/S raras e pesadas, algumas plataformas de hardware podem retornar uma leitura obsoleta. Se o diagnóstico estendido indicar uma possível condição de leitura obsoleta ou gravação perdida, entre em contato com o fornecedor de hardware para acompanhamento imediato e teste com o utilitário SQLIOSim .
O SQL Server requer que os sistemas ofereçam suporte à entrega garantida para mídia estável, conforme descrito nos Requisitos do Programa de Confiabilidade de E/S do SQL Server. Para obter mais informações sobre os requisitos de entrada e saída para o mecanismo de banco de dados do SQL Server, consulte Requisitos de entrada/saída do mecanismo de banco de dados do Microsoft SQL Server.