quarta-feira, 16 de janeiro de 2008

Estrutura Interna do arquivo de Log - Parte 3

Parte 3 - "Virtual Log Files" (Logs Virtuais)

Um arquivo de LOG é dividido internamente em porções chamadas de "Virtual Log Files" (VLFs), onde seu tamanho é determinado pelo seu tamanho inicial e sua taxa de crescimento. Quando um arquivo de LOG é criado o SQL Server cria de 4 a 16 VLFs, passando a ser a unidade de crescimento e redução no tamanho.

Um VLFs pode estar em um de 4 estados possíveis:

1 - "Active"
A porção ativa do LOG começa no MinLSN (visto na Parte 1 do artigo) e termina no final lógico. Basta um VLFs conter uma pequena porção ativa do LOG para estar com o status "Active". Este VLFs nunca poderá ser truncado!

2 - "Recoverable"
Porção do LOG anterior a mais antiga transação em aberto, necessária penas para manter a sequência de transaçãoes em um processo de recuperação de dados através de Backup do Log.

3 - "Reusable"
Quando ocorre um Backup do Log ou "Checkpoit" (no "Recovery Model Simple"), os VLFs com Status de "Recoverable" passam para "Reusable", e poderão ser sobrescritos.

4 - "Unused"
Compreende um ou mais VLFs ao final do arquivo de LOG que ainda não receberam registros.

Vamos criar um banco de dados para analisar o seu arquivo de Log com a instrução DBCC LOGINFO.

create database DBLog
go


Os VLFs podem ser vistos com a instrução não documentada DBCC LOGINFO sem parâmetro, devendo ser executada no banco corrente da conexão. Executando DBCC LOGINFO no banco DBLog, sem alteração após a sua criação, teremos o resultado abaixo:

Cada linha representa um Log Virtual (VLFs), sendo que na coluna FileId temos o ID do arquivo de LOG que contém o VLFs (o banco DBLog possui um arquivo de LOG, por isso todos os VLFs possuem o mesmo valor em FileID).

A coluna StartOffset retorna a posição em bytes de inicio do VLFs dentro do arquivo de LOG; a coluna FileSize retorna o tamanho do VLFs em bytes. Reparem que existe uma região no início do arquivo de LOG que não apareceu no DBCC LOGINFO (de 0 a 8192 bytes), pois representa o Header (cabeçalho) do Arquivo. A primeira linha representa o primeiro VLF iniciando em 8192 bytes e finalizando em 262143 bytes (8192 + 253952).

Já a coluna FSeqNo indica a seqüência de utilização dos VLFs, no exemplo acima o último VLF utilizado foi o primeiro (FSeqNo = 21), o segundo VLF nunca foi utilizado pois permanece com zero. A coluna Status indica se o VLF está em uso (valor 2) ou disponível para uso (valor 0).




Um arquivo de Log com muitos VLFs gera lentidão no processo de recovery, sendo a quantidade de VLFs determinada em função do tamanho inicial do arquivo e a sua razão de crescimento. Por este motivo é indicado criar o arquivo de Log com o tamanho que se espera utilizar e definir o crescimento em unidades grandes, para gerar poucos VLFs.

Se o seu arquivo de Log já está com muitos VLFs, basta executar um SHRINK no arquivo de Log para acertar a casa!

Até o próximo post!
Landry.







Nenhum comentário: