O seguinte é um trecho de um livro ORACLE
Durante a recuperação do cache, o Oracle reproduz as transações dos arquivos redo log online desde o último ponto de verificação. Durante essa operação de avanço, as alterações confirmadas e não confirmadas são aplicadas aos arquivos de dados. No final da operação rollforward, os arquivos de dados terão alterações confirmadas, alterações não confirmadas que foram gravadas nos arquivos de dados para liberar espaço no cache do buffer e alterações não confirmadas aplicadas pela operação rollforward . O banco de dados pode ser aberto assim que a recuperação do cache for concluída.
A frase em negrito acima é a que eu não entendo. Como um arquivo de redo log pode gerar dados não confirmados, já que todas as suas informações são registradas após o COMMIT?
Além disso, diz
Na fase de recuperação da transação da recuperação da instância, o Oracle aplica blocos de desfazer para reverter alterações não confirmadas em blocos de dados que foram gravados antes da falha da instância ou feitos pela operação de avanço durante a recuperação do cache .
Eu entendo que se os blocos sujos foram gravados no disco sem um COMMIT anterior (se possível), durante a recuperação da transação, os blocos de desfazer podem ser usados para revertê-los. MAS como os blocos de desfazer podem ser usados para reverter alterações não confirmadas (o que são essas alterações de qualquer maneira ...) introduzidas pela repetição de logs de refazer durante a recuperação do cache?
Hmmm, não entendo, pois o redo log online, que deve conter apenas informações confirmadas, cria informações não confirmadas durante a recuperação da instância.
LGWR
processo libera redo logs do cache de buffer de redo log para arquivos de redo log on-line quando-DBWn
processo grava buffer sujo no disco.Todos esses gatilhos refazem o flush, o que pode incluir transações não confirmadas.
Deixe-me dar um exemplo, suponha que você tenha um bloco de dados que contém uma linha com uma única coluna com valor
5
. Você simplesmente tenta atualizá-lo usandoupdate tbl set col1=6
. Durante este processo, undo é gerado para reproduzir seu valor original que é5
e redo é gerado para responder a transação, significa reproduzir o último valor que é6
.Em seguida, se esta transação não for confirmada e, infelizmente, a instância travar, durante a próxima inicialização, o Oracle (especificamente
SMON
o processo) pega os blocos que precisam ser recuperados no cache do buffer e reaplica as alterações usando redo logs e se alguém tentar ler o linha que você modificou antes, o Oracle simplesmente reverteu o bloco de dados contendo a linha para seu valor original que é 5 usando desfazer.Atualização: O trecho do log de alerta a seguir foi extraído deste blog .
Isso mostra claramente que o número do bloco
1721
precisa ser recuperado. E para fazer isso, o bloco é carregado na memória (buffer cache) e o redo é aplicado. O bloco é gravado de volta no arquivo de dados após a recuperação.Isso também é explicado em (Capítulo 9 Refazer e Desfazer, Como Refazer e Desfazer Funcionam Juntos, Página ) Livro Expert Oracle Architecture Terceira Edição de Thomas Kyte.
De ASKTOM
Recuperação de instância/falha