Como criar uma demo usando fn_dblog
Esses dias estive olhando vários artigos sobre SQL Server em busca de inspiração. Descobri que a função fn_dblog é uma das mais usadas para montar uma demonstração de “internals” do SQL Server. Ótimo, pois agora é minha vez de mostrar algo sobre ela.
Exemplo:
Podemos usar a função fn_dblog para ilustrar o que acontece com um comando UPDATE após passar por uma replicação transacional.
select * from ::fn_dblog(null,null)
- UPDATE (normal):
- UPDATE (com replicação):
Como mágica, revelamos que um comando UPDATE foi substituído pelo par de comandos (DELETE, INSERT).
Esse foi um rápido exemplo do porquê essa função fn_dblog é tão usada em demonstrações - ela mostra muita coisa interessante e invisíveis ao olho humano.
A função db_fnlog executa a leitura sequencial do log. Ela utiliza uma lógica praticamente idêntica ao LogReader (sim, aquele robô usado pela replicação transacional e Change Data Capture), usando o mecanismo chamado de “Log Scan”.
O seu funcionamento é bastante simples:
- Primeiro se localiza o início do log (que normalmente corresponde ao último checkpoint nas bases de recovery simple)
- Depois, os registros do log são carregados em memória e decodificados no formato de tabela
Agora vão as minhas dicas sobre como montar uma Demo do Transaction Log:
1. Comece “limpando” os logs usando o comando de CHECKPOINT
A função fn_dblog sempre procura o último checkpoint realizado. Ao “limpar” o log, somente três registros são reportados:
O comando CHECKPOINT grava o ponto de início (LOP_BEGIN_CKPT), descarrega as páginas em disco, atualiza a página de boot com o último LSN (LOP_XACT_CKPT –> LCX_BOOT_PAGE_CKPT) e finaliza sua transação (LOP_END_CKPT).
2. Domine o conceito do Log Sequence Number (LSN)
Sempre que você olhar o arquivo de log, vai se deparar com o conceito de LSN. Com a função db_fnlog não é diferente, pois a primeira coluna corresponde ao “Current LSN”. Assim recomendo que se acostume com o formato desse identificador.
Log Sequence Number (LSN)
https://blogs.msdn.com/b/fcatae/archive/2010/02/24/log-sequence-number-lsn.aspx
Resumindo: o primeiro hexadecimal corresponde ao Virtual Log File (VLF), enquanto que o segundo e o terceiro são o offset de deslocamento (LogBlock + Slot).
3. Conheça as estruturas de alocação do SQL Server
Os cursos de internals normalmente falam das páginas GAM, SGAM e IAM e depois citam as estruturas de Allocation Unit, Partition e HoBT. Todas essas informações estão presentes no log.
- Context
- PartitionId
- AllocUnitId (AllocUnitName)
- Page ID / Slot ID
A coluna AllocUnitName apresenta o nome do objeto, entretanto, essa informação não é armazenada no log. Na realidade, a função determina o nome do objeto a partir do AllocUnitId.
4. Por curiosidade, procure entender o que significa o Transaction SID e SPID.
Acredito que os “amigos do sp_who” saibam bem o significado de SPID. Em relação ao Transaction SID, procure pela função SUSER_SNAME. Você pode se surpreender!
5. Essa função é não documentada. Portanto, evite rodar em uma base de produção.
Uma alternativa é usar o XEvent. Veja o blog do Luti:
Estudando o TLog usando xEvents
https://luticm.blogspot.com.br/2012/05/estudando-o-tlog-usando-xevents.html
Comments
- Anonymous
February 27, 2014
Excelente Fabricio ! Obrigado por compartilhar