CHECKPOINT ou COMMIT grava no disco?

12

Digamos, para SQLServer2008R2 e superior, com bancos de dados em modo de recuperação completa.

Eu sempre pensei :

  1. Quando uma transação é confirmada (COMMIT), a transação é gravada no log de transações na RAM.

  2. Quando ocorre um CHECKPOINT (após algum tempo e / ou algumas transações e outros critérios), as transações entre o último CHECKPOINT e o atual são gravadas no disco.

  3. Quando ocorre um BACKUP LOG, os dados são gravados no arquivo MDF.

Estou correcto? Alguns de meus colegas dizem que estou errado, e é difícil encontrar a resposta correta, mesmo com o BOL.

Obrigado!

madoxav
fonte

Respostas:

20

Infelizmente, há um número de erros nas respostas até agora em relação ao funcionamento do COMMIT, então adicionarei outro. Consulte Como funciona: a apresentação de E / S do SQL Server de Bob Dorr para obter detalhes e noções básicas de E / S do SQL Server 2000 . Aqui está como isso funciona:

  • Todas as gravações (alterações) de dados totalmente registrados ocorrem na sequência exatamente a seguir (consulte Noções básicas sobre como o SQL Server executa uma consulta: Gravando dados ):

    • A página de dados é trancada exclusivamente
    • Um registro de log que descreve a alteração é adicionado ao log, na memória. O novo registro de log gera um novo LSN, consulte O que é um LSN: Número de sequência de log .
    • A página de dados é modificada (registro de dados e last_update_lsn na página). Esta página está agora modificada ('suja').
    • A trava da página de dados é liberada
    • nada é gravado no disco diretamente como resultado da atualização
  • Um COMMIT faz o seguinte

    • adiciona um novo registro de log que descreve o COMMIT ao log, na memória
    • todos os registros de log não liberados para o disco, inclusive o gerado acima, são liberados (gravados no disco)
    • os blocos de encadeamento aguardam até que o SO relate a gravação acima como durável (E / S concluída)
    • A instrução COMMIT (ou instrução DML com confirmação implícita) é concluída
  • Um CHECKPOINT faz o seguinte (simplificado), consulte Como funcionam os pontos de verificação e o que é registrado :

    • Todas as páginas sujas na memória são gravadas no disco
      • Para cada página suja, antes de começar a gravar no disco, o logon e inclusive o LSN que é o last_update_lsn nessa página é liberado (gravado no disco). Observe que liberar qualquer LSN implica que todos os LSNs anteriores também sejam liberados, portanto, para as páginas mais sujas, isso não é uma operação, pois seu próprio last_update provavelmente já está liberado.
    • registro de log que descreve o ponto de verificação é gravado no log e liberado
    • a página de inicialização do banco de dados é atualizada com o LSN do registro gerado acima

As gravações funcionam de maneira diferente para operações minimamente registradas, consulte Operações que podem ser minimamente registradas . Aproximadamente as operações minimamente registradas agem da seguinte forma (simplificadas):

  • Antes de inserir linhas em uma página como parte de uma operação minimamente registrada, um registro de log descrevendo o fato de a página participar de operações minimamente registradas está sendo gerado e anexado ao log (na memória)
  • A página minimamente registrada está sendo atualizada, pois muitas inserções estão sendo gravadas nela. Nada é registrado, nada é gravado no disco.
  • Quando uma operação minimamente registrada é confirmada, antes que ela seja confirmada, é necessário que todas as páginas que participaram de operações minimamente registradas nessa transação sejam gravadas no disco. Quando a gravação é concluída, o registro de log COMMIT pode ser anexado ao log (na memória) e o log, incluindo esse novo registro de log recém-adicionado, é liberado (gravado) no disco.
Remus Rusanu
fonte
8

Quando uma transação é confirmada (COMMIT), a transação é gravada no log de transações na RAM.

Uma transação é gravada no log de transações antes mesmo de alterar a página ou os dados conforme solicitado pela consulta. Isso é chamado de gravação antecipada (WAL). Se o SQL Server travar enquanto uma página estiver sendo atualizada na memória, o WAL garantirá que o mecanismo do DB possa ler o log de transações e reverter a transação. Esta é uma propriedade ACID de um RDBMS.

Quando ocorre um CHECKPOINT (após algum tempo e / ou algumas transações e outros critérios), as transações entre o último CHECKPOINT e o atual são gravadas no disco.

Um ponto de verificação limpa páginas sujas do buffer para o disco. Ele se comporta de maneira um pouco diferente para o tempdb . Uma página suja é aquela que foi alterada desde a leitura do disco. Esse processo de ponto de verificação cria uma marca no log de transações até o ponto em que as transações foram confirmadas. Após uma falha, a recuperação sabe que todas as transações até essa marca foram confirmadas. Você pode emitir o ponto de verificação manualmente com um comando TSQL.

Quando ocorre um BACKUP LOG, os dados são gravados no arquivo MDF.

Não, quando o log de backup ocorre, o SQL Server copia as informações do log de transações do arquivo de log do banco de dados para o disco em que você está gravando o backup. Uma operação de backup lê dados do disco e grava dados no disco.

Eu gostaria que você lesse os links abaixo

Noções básicas sobre log e recuperação no SQL Server Já apontado por Mark

Livro interno do SQL Server 2008 e solução de problemas

Arquitetura e gerenciamento de log de transações

Shanky
fonte
Ok, parece claro. Apenas por ter certeza: quando um COMMIT acontece, você diz que está gravado no log de transações; você quer dizer buffer ou disco (LDF)?
Madoxav
Ele sempre seria gravado no cache de log primeiro e depois liberado no log de transações no disco. Eu adicionei ligação gerenciamento de log de transações por favor se referir a ele por quanto WAL funciona
shanky
"Se o SQL Server travar enquanto uma página estiver sendo atualizada na memória, o WAL garantirá que o mecanismo de banco de dados possa ler o log de transações e reverter a transação." Isso só é verdade se a transação não for confirmada. Se já estiver confirmado, nada poderá ser revertido. As informações no log de transações são usadas para atualizar os arquivos de dados. Mesmo que o buffer não tenha sido gravado no arquivo de dados antes da falha.
precisa saber é o seguinte
@ Miracle: Eu acho que se a página está sendo atualizada, que está relacionada a uma transação específica, é claro que a transação não seria confirmada.
Shanky 9/09/14
4

Abaixo, vamos esclarecer as coisas para você:

Quando uma transação é confirmada (COMMIT), a transação é gravada no log de transações na RAM.

  • COMMIT (ou BEGIN) não tem nada a ver com o modelo de recuperação. Está no nível da transação. Uma transação deve ser totalmente concluída ou falhar ( lembre-se das propriedades do ACID ). Portanto, essencialmente, um COMMIT marcará o final de uma transação bem-sucedida (implícita ou explícita). Uma instrução COMMIT garantirá que todas as modificações da transação sejam parte permanente do banco de dados.
  • Para fazer alterações, o SQL Server usará o WAL (Write-ahead Logging), no qual descreverá primeiro no log qualquer alteração que está prestes a fazer, antes de modificar os dados.

Quando ocorre um CHECKPOINT (após algum tempo e / ou algumas transações e outros critérios), as transações entre o último CHECKPOINT e o atual são gravadas no disco.

Quando ocorre um BACKUP LOG, os dados são gravados no arquivo MDF.

Referir-se :

Kin Shah
fonte