Dando continuidade a série de posts para melhorar o entendimento do funcionamento do arquivo de BI, os assuntos a abordar neste post são “undo-redo logging” e “write-ahead logging”.
► Undo-Redo Logging
O arquivo onde são registradas as anotações de “undo-redo logging” é o “arquivo de before image”. Este arquivo guarda o log de todas as alterações recentes ao banco de dados. Considerando que a execução de transações altera o banco de dados o gerenciador do banco grava uma ou mais anotações descrevendo cada alteração no arquivo de BI. Apesar do arquivo ser chamado “arquivo de before image”, as anotações feitas no arquivo contém mais do que os valores originais dos campos. A informação gravada é suficiente para:
- Desfazer os efeitos da transação que não foi concluída;
- Restaurar o banco a um estado consistente depois de uma falha;
- Reutilizar o espaço no arquivo quando ele não é mais necessário;
- Limitar a quantidade de informações processadas quando estiver se recuperando de uma falha.
Dependendo da operação sendo executada, as anotações gravadas no BI podem ser uma cópia dos dados antes de alterados, uma cópia dos novos dados, ou uma combinação de ambos, ou ainda alguma outra informação. Existem mais de 50 tipos de anotações possíveis, e cada tipo contém dados diferentes.
Alterações no banco são mantidas em memória, no “buffer pool” do banco, e são escritas no arquivo do banco em disco apenas quando isto se fizer necessário. Ao longo do tempo, a cópia do banco em disco vai se tornando mais e mais desatualizada.
O estado atual do banco é a soma da parte em disco do banco, mais a parte residente em memória(conteúdo do buffer pool, da tabela de transações, e outras estruturas de dados residentes em memória). Quando um banco é baixado pelos meios corretos, os dados residentes em memória são escritos em disco. Quando uma falha ocorre, a parte do banco residente em memória será perdida, mas pode ser reconstruída a partir das anotações no arquivo de BI.
► Write-ahead Logging
Todas as alterações no banco são anotadas no arquivo de BI primeiro, e depois no banco de dados. Desta maneira, as anotações gravadas no BI poderão ser utilizadas para refazer as alterações que ainda não foram aplicadas ao banco. Esta técnica permite que as alterações no banco permaneçam em memória por um longo tempo, antes de serem gravadas no arquivo do banco em disco.
No entanto, existe a necessidade de se garantir que todas as gravações de anotações no arquivo de BI sejam executadas sem bufferização de qualquer natureza – “modo síncrono”. Caso as anotações sejam armazenadas temporariamente em buffers mantidos pelo sistema operacional, estas serão perdidas em caso de falha do sistema. No caso de uma falha ocorrer, a anotação de que uma transação foi concluída pode ser perdida, ou as escritas das alterações no banco poderão ocorrer antes das anotações das alterações serem gravadas no arquivo de BI. Isto pode ocorrer porque o sistema operacional define livremente o momento de executar a gravação dos dados, bufferizados por ele, em disco. Caso isto aconteça, poderá acontecer uma gravação no arquivo do banco em disco para a qual não existe anotação no arquivo de BI. Sem esta gravação no arquivo de BI, a alteração no banco não poderá ser desfeita.
No próximo post serão abordados os assuntos “Transaction Undo” e “Crash recovery”.