Академический Документы
Профессиональный Документы
Культура Документы
LSN Instruo
001 INSERT INTO Clientes VALUES (1,Alberto,2560.92,M)
002 DELETE FROM AjusteEstoque WHERE IDAjuste = 3097
CREATE TABLE Defeitos (IDDef INT, IDProd INT, Data
003
SMALLDATETIME)
004 CHECKPOINT
ALTER TABLE Produtos ADD DataUltimaAtualizacao
005
SMALLDATETIME
006 UPDATE Produtos SET DataUltimaAtualizacao = DataCadastro
007 GRANT SELECT ON Produtos TO UsrMarketing
008 EXEC sp_addrolemember db_datareader, UsrRelatorios
009 CHECKPOINT
010 DROP TABLE ProdutosHistorico
A propriedade RECOVERY MODEL
O Recovery Model de um banco de dados tem papel fundamental no funcionamento dessas estruturas de log
e nas estratgias possveis de Disaster Recover a partir de um backup. H trs opes para o Recovery
Model: Simple, Bulk Logged e Full. No explicarei os detalhes do funcionamento do Bulk Logged dada sua
proximidade com o Recovery Model Full. Para o entendimento desse artigo, o Recovery Model Bulk
Logged e Full podem ser interpretados como iguais embora no o sejam em alguns casos.
No Recovery Model Simple todas as transaes so gravadas no arquivo de Log, mas a cada Checkpoint
elas so excludas do arquivo de Log liberando espao para novas entradas. Se considerarmos que o arquivo
de log exemplificado tem capacidade para gravar 10 LSNs e que o Recovery Model est marcado como
Simple, aps o Checkpoint do LSN004, os LSNs 001, 002, 003 e 004 seriam eliminados do arquivo de log,
o mesmo valeria para os LSNs 005, 006, 007, 008 e 009 aps o Checkpoint em LSN009. Se nesse momento
aparecessem mais algumas entradas, elas seriam gravadas no incio do arquivo que foi liberado. Ex
LSN Instruo
011 TRUNCATE TABLE TMP
012 EXEC UspRelatorioVendas @DataInicio = 20090720
013 DBCC CHECKTABLE(RelatoriosConsolidados)
014 CHECKPOINT
015 DROP USER UsrApp
LSN Instruo
001 INSERT INTO Clientes VALUES (1,Alberto,2560.92,M)
002 DELETE FROM AjusteEstoque WHERE IDAjuste = 3097
CREATE TABLE Defeitos (IDDef INT, IDProd INT, Data
003
SMALLDATETIME)
004 CHECKPOINT
ALTER TABLE Produtos ADD DataUltimaAtualizacao
005
SMALLDATETIME
006 UPDATE Produtos SET DataUltimaAtualizacao = DataCadastro
007 GRANT SELECT ON Produtos TO UsrMarketing
008 EXEC sp_addrolemember db_datareader, UsrRelatorios
009 CHECKPOINT
010 DROP TABLE ProdutosHistorico
011 TRUNCATE TABLE TMP
012 EXEC UspRelatorioVendas @DataInicio = 20090720
013 DBCC CHECKTABLE(RelatoriosConsolidados)
014 CHECKPOINT
015 DROP USER UsrApp
Uma vez que o Recovery Model Full faz com que o banco de dados no exclua as entradas antigas do log de
transaes, ou seja, as transaes que j esto contempladas no banco de dados, no de se esperar que o
log cresa de forma indefinida. Afinal novas transaes iro gerar novos LSNs e como esses no so limpos
de forma automtica o resultado final um arquivo de log de tamanhos acima do normal. O crescimento do
Log se dar na velocidade em que novas transaes ocorrem, mas fato que mais cedo ou mais tarde ele ir
incomodar.
Uma concluso inicial que se o arquivo de Log cresce de forma descomunal, o banco de dados no pode
estar em Recovery Model Simple. Se o Recovery Model Simple faz a devida excluso das entradas inativas
(aquelas j contempladas pelo Checkpoint), no h como o Recovery Model Simple fazer com que um
arquivo de Log cresa de forma desproporcional (muitas vezes ele no cresce). Se o banco de dados estiver
com o Recovery Model Simple, a nica preocupao ter um arquivo de log que consiga acomodar a
quantidade mdia de transaes entre um checkpoint e outro.
A primeira recomendao que se o arquivo de Log cresce demais, ao invs de simplesmente efetuar o
Truncate com o Shrink funcionem, mais factvel mudar o Recovery Model para Simple. Assim, o arquivo
de Log no ir crescer de forma descomunal e tender a ficar constante. Embora o Truncate com o Shrink
funcione, o problema voltar a acontecer, pois, se o Recovery Model Full o Log ir crescer novamente. Ao
invs de executar sucessivos Truncates e Shrinks mais sensato alterar o Recovery Model para Simple
eliminando a causa raiz do problema.
A ttulo de curiosidade, o truncate iria eliminar as entradas inativas do log, ou seja, todas aquelas anteriores
ao ltimo checkpoint e o shrink iria reduzir o arquivo, possivelmente devolvendo-o ao tamanho de 10 LSNs
ao invs de 15 conforme a tabela abaixo:
LSN Instruo
015 DROP USER UsrApp
O incio do arquivo ficaria pronto para receber novas entradas de LSN. Com o tempo, o Log cresceria e
provocaria sucessivas expanses at que um novo truncate e um novo shrink fossem executados.
Se a diferena entre o Recovery Model Simple e o Recovery Model fosse apenas a administrao do
tamanho do arquivo de log seria interessante perguntar qual a utilidade do Recovery Model Full. Enquanto o
Recovery Model Simple dispensa maiores preocupaes com o tamanho do arquivo de log, o Recovery
Model Full traz responsabilidades e preocupaes adicionais e isso um forte indcio para pensar porque os
bancos de dados no so criados com o Recovery Model Simple ? D muito menos trabalho.
sem dvida um raciocnio que faz sentido, mas vejamos a seguir porque o Recovery Model Full
importante mesmo com as implicaes e overheads administrativos.
A escolha do Recovery Model e o processo de restaurao
O Recovery Model tem papel fundamental no processo de backup e restaurao do banco de dados. Alguns
Recovery Models permitem a realizao de backups de log e posterior recuperao enquanto outro
simplesmente no permitem. O uso de backup de logs tambm imprecindvel para algumas estratgias de
backup e restore mais complexas como o Restore Online e o Piecemal Restore ambos utilizados em
conjunto com backups e filegroups. Por hora basta saber que o Recovery Model Simple no possibilita a
realizao de backups de logs enquanto que os demais Recovery Models possibilitam.
A razo para o Recovery Model Simple no permitir backups de logs um pouco bvia. Como ele exclui as
entradas mais antigas do Log de transaes a cada Checkpoint e como cada Checkpoint ocorre em mdia de
minuto em minuto, no faria muito sentido fazer o backup do log de transaes de uma base com o
Recovery Model Simple. No haveria o que gravar no backup, pois, provavelmente no momento de faz-lo
restariam apenas as entradas mais recentes (as que o Checkpoint) ainda no contemplou enquanto que
muitos outros LSNs teriam sido deixados de lado. Como o Recovery Model Full no exclui as entradas do
Log (mesmo as j contempladas pelo Checkpoint), faz sentido em falar de backups de log para bases com o
Recovery Model Full. Vejamos como isso funciona atravs do hipottico arquivo de log.
A exceo do ltimo comando, esse script no faz nada demais. Ele apenas cria um banco, duas tabelas e faz
um backup full. O ltimo comando l as informaes do cabealho do backup full e mostra algumas
informaes de LSN sobre esse backup. Existem vrias colunas, mas em especial duas merecem ateno:
FirstLSN LastLSN
22000000008400155 22000000015000001
Possivelmente os LSNs exibidos no sero os mesmos obtidos, pois, a sua numerao depende de vrias
caractersticas prprias de cada instncia, bancos de dados criados, etc. A coluna FirstLSN mostra o LSN
mais antigo encontrado no backup (22000000008400155) e o mais recente (22000000015000001). As
transaes que esto contempladas no backup full (juntamente com os dados), so todas as que ocorreram
entre os LSNs 22000000008400155 e 22000000015000001.
Seguindo com o exemplo, sero realizadas algumas inseres nessas tabelas e ser realizado um backup de
log.
Insere registros nas tabelas de Disciplinas e Cursos
INSERT INTO SisMtr.dbo.Disciplinas VALUES (1,Histria e Formao do Direito)
INSERT INTO SisMtr.dbo.Disciplinas VALUES (2,Introduo Economia)
INSERT INTO SisMtr.dbo.Disciplinas VALUES (3,Administrao Contempornea)
INSERT INTO SisMtr.dbo.Disciplinas VALUES (4,tica)
INSERT INTO SisMtr.dbo.Disciplinas VALUES (5,Metodologia Cientfica)
FirstLSN LastLSN
22000000008400155 22000000016900001
A coluna FirstLSN mostra que o primeiro LSN contemplado no backup de log 22000000008400155. A
coluna LastLSN mostra que o ltimo LSN contemplado 22000000016900001. Isso significa que esse
backup de Log contempla todas as transaes ocorridas entre os LSNs 22000000008400155 e
22000000016900001. Pode parecer estranho, pois, o backup full contemplava as transaes entre o LSN
22000000008400155 e o LSN 22000000015000001 e o de Log de transaes tambm contempla essas
transaes j que se inicia no LSN 22000000008400155 e termina no LSN 22000000016900001 que
superior ao LSN 22000000015000001 (LastLSN) do backup full. Isso esperado porque esse foi o primeiro
backup de log de transaes e todo o contedo do arquivo do Log de transaes foi "despejado" para o
backup de Log.
Cria uma tabela Associativa
CREATE TABLE SisMtr.dbo.DisciplinaCurso (
IDDisciplina INT, IDCurso INT)
FirstLSN LastLSN
22000000016900001 22000000018800001
O primeiro LSN contemplado no arquivo o LSN 22000000016900001 e o ltimo LSN contemplado o
22000000018800001. Isso significa que esse backup de Log contempla todos os LSNs entre
22000000016900001 e 22000000018800001. As sequncias de LSNs aps a realizao dos backups so
mostradas na tabela abaixo:
A tabela Disciplinas tem 5 registros, a tabela Cursos tem 2 registros e a tabela DisciplinasCurso tem 8
registros. Ao final do processo de restaurao, esse mesmo resultado deve ser obtido.
Restaura o Backup Full
RESTORE DATABASE SisMtr FROM DISK = C:\Temp\SisMtrFull.BAK WITH NORECOVERY
Verifica o status dos arquivos de dados do banco
SELECT
DB_Name(Database_ID) As Banco, Name As ArquivoLogico,
Differential_Base_LSN As LSN_Inicial, Redo_Start_Lsn As LSN_Final
FROM sys.master_files
WHERE Database_ID = DB_ID(SisMtr) And Data_Space_Id > 0
Aps restaurar o backup full, verifica-se que os LSNs contemplados no banco so justamente os mesmos
obtidos pelo processo de restaurao:
Aps a restaurao do primeiro backup de Log, verifica-se que o banco parou no LSN final (Last LSN) do
backup de Log:
Aps a aplicao do segundo backup de Log, verifica-se que o banco parou no LSN final (Last LSN) do
backup de Log:
Aps o banco de dados ficar OnLine e disponvel no possvel mais determinar qual o LSN final, pois,
nunca se sabe quando em qual LSN as transaes iro parar de ocorrer, pois, esperado que o banco de
dados no tenha nenhum tipo de problema que afete o seu funcionamento e que transaes futuras venham a
ser realizadas. Essa a razo pela qual o valor da coluna LSN_Final nula nesse caso. O objetivo foi
demonstrar que os backups foram aplicados e que os LSNs estavam sendo contemplados. O processo de
restaurao foi possvel porque as sequncias de LSNs estavam ntegras e refletidas no backup.
O exemplo prtico com o BACKUP LOG WITH TRUNCATE_ONLY
Como ser que o uso do truncate pode afetar o processo de backup ? Vou utilizar um outro exemplo para
simular o que costuma ocorrer em ambiente de produo quando esse comando utilizado.
Cria o banco de dados
CREATE DATABASE BDCargas ON (
NAME=BDCargas_Data, SIZE=10MB,
FILENAME=C:\Temp\BDCargas_Data.MDF)
LOG ON (
NAME=BDCargas_Log, SIZE=1MB,
FILENAME=C:\Temp\BDCargas_Log.LDF)
O script simplesmente cria um banco de dados chamado BDCargas, muda o Recovery Model para Full (caso
j no esteja) e verifica o tamanho dos arquivos utilizados respectivamente 10MB para dados e 1MB para
Log. As informaes do Backup Full em relao ao LSN so:
FirstLSN LastLSN
23000000005900037 23000000007700001
O prximo passo fazer com que o Log encha fazendo-se "necessrio" o comando de TRUNCATE. O script
abaixo cria uma tabela e efetua vrios Inserts e Deletes. O tamanho do arquivo de dados no ir se alterar,
pois, cada insero gera uma excluso, mas como as duas aes so logadas, o arquivo de log ficar muito
grande.
Cria uma tabela
CREATE TABLE BDCargas.dbo.Registros (
ID INT IDENTITY(1,1), Mascara UNIQUEIDENTIFIER DEFAULT NEWID())
Trunca o Log
BACKUP LOG BDCargas WITH TRUNCATE_ONLY
Aps executar o comando de truncagem e em seguida o Shrink notvel a diminuio do arquivo de Log de
214MB para o seu tamanho original:
Antes de excluir o banco de dados, o SELECT mostrou que haviam cinco registros cadastrados com os
respectivos IDs 200.001, 200.002, 200.003, 200.004 e 200.005. Porm, ao tentar fazer um novo backup de
Log, o SQL Server advertiu uma mensagem de erro.
Msg 4214, Level 16, State 1, Line 1
BACKUP LOG cannot be performed because there is no current database backup.
Msg 3013, Level 16, State 1, Line 1
No foi possvel fazer o backup de Log, pois, ele est sem referncias. Como o log foi truncado entre o
ltimo backup de Log e a tentativa de um novo backup, transaes foram descartadas do Log sem terem
sido copiadas. Isso significa que embora esteja tudo certo com o banco, a estratgia de backups baseada em
Logs ficou inviabilizada, pois, houve uma quebra de sequncia. Uma forma de tornar a estratgia de Logs
possvel novamente a realizao de um novo backup full.
Efetua um novo Backup Full
BACKUP DATABASE BDCargas TO DISK = C:\Temp\BDCargasFull02.BAK
Efetua um novo Backup de Log
BACKUP LOG BDCargas TO DISK = C:\Temp\BDCargasLog02.TRN
At pode-se tirar um novo backup full para viabilizar os logs posteriores, mas o fato que algumas
possibilidades foram perdidas. A tabela abaixo mostra o resumo dos backups e seus LSNs.