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):

image

  • UPDATE (com replicação):

image

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:

  1. Primeiro se localiza o início do log (que normalmente corresponde ao último checkpoint nas bases de recovery simple)
  2. 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:

image

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