"Recuperação pseudo-simples do SQL Server" é termo e cenário, acabei de tomar conhecimento em um comentário (agora excluído) para a nova pergunta SQL Server trunca logs de transações com backups somente de cópia
Eu fui para o post Pseudo-Simple SQL Server Recovery Model 7 de outubro de 2019 por Rajendra Gupta e usando parte do código lá e alguns dos meus próprios fiz alguns testes.
Crie o banco de dados (código de Rajendra)
CREATE DATABASE RecoveryModel;
e Valide se está na íntegra (código de Rajendra)
SELECT name,
recovery_model_desc
FROM sys.databases
WHERE name = 'RecoveryModel';
Faça algum trabalho (código de Rajendra, ligeiramente modificado)
Use RecoveryModel
CREATE TABLE test(id INT);
GO
INSERT INTO test
VALUES(1);
GO 5000
Veja quanto espaço de log é usado (meu código)
select file_id
, type_desc
, name
, substring([physical_name],1,3) AS [Drive]
, physical_name
, state_desc
, size / 128 as 'AllocatedSizeMB'
, FILEPROPERTY([name],'SpaceUsed') /128 AS 'SpaceUsedMB' --Addapted from https://sqlperformance.com/2014/12/io-subsystem/proactive-sql-server-health-checks-1
, (1- (FILEPROPERTY([name],'SpaceUsed') / CAST (size AS MONEY))) *100 AS 'PercentFree'
, growth / 128 as 'GrowthSettingMB'
from sys.database_files
order by type_desc Desc, name
Descobrimos que o log está sendo preenchido. Execute o trabalho novamente e verifique o tamanho, o log cresce, sem surpresa.
Tente executar o t-log (meu código)
BACKUP LOG [RecoveryModel] TO
DISK = N'E:\SQLBackups\RecoveryModel.trn' WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD
GO
Ele falha com a mensagem:
Msg 4214, Nível 16, Estado 1, Linha 8
BACKUP LOG não pode ser executado porque não há backup de banco de dados atual.
Msg 3013, Nível 16, Estado 1, Linha 8
BACKUP LOG está terminando de forma anormal.
Nada remotamente simples sobre isso, se você tentar fazer backup de um banco de dados em recuperação simples. você recebe a mensagem
Msg 4208, Nível 16, Estado 1, Linha 19
A instrução BACKUP LOG não é permitida enquanto o modelo de recuperação for SIMPLE. Use BACKUP DATABASE ou altere o modelo de recuperação usando ALTER DATABASE.
Execute um backup somente de cópia (meu código)
BACKUP DATABASE [RecoveryModel] TO
DISK = N'E:\SQLBackups\RecoveryModel.bak' WITH NOFORMAT, INIT, COPY_ONLY,
NAME = N'RecoveryModel-Full Database Backup', SKIP, NOREWIND, NOUNLOAD
GO
Funciona bem, verifique o espaço de log e não encolheu. Execute a carga de trabalho por mais algum tempo e o espaço de log continua a crescer. Execute um backup t-log e ele continua a falhar.
Execute um backup diferencial (Meu código)
BACKUP DATABASE [RecoveryModel] TO
DISK = N'E:\SQLBackups\RecoveryModel.dif' WITH DIFFERENTIAL , NOFORMAT, NOINIT,
NAME = N'RecoveryModel-Diff Database Backup', SKIP, NOREWIND, NOUNLOAD
GO
Ele falha assim como o t_log
Msg 3035, Level 16, State 1, Line 13 Não é possível realizar um backup diferencial para o banco de dados "RecoveryModel", porque não existe um backup de banco de dados atual. Execute um backup completo do banco de dados emitindo novamente BACKUP DATABASE, omitindo a opção WITH DIFFERENTIAL.
Então, o que é "Pseudo-Simples" sobre isso? Os logs crescem, os backups t-log e diferentes falham. Você tem um banco de dados em recuperação completa, sem backup completo.
Edit , parece que há algo específico para servidores na minha compilação que está causando resultados diferentes do que todos os outros estão vendo. Eu aceitei a resposta de Josh.
Veja este artigo de Paul Randal, especialista em modelos de recuperação de banco de dados: Novo script: esse banco de dados está REALMENTE no modo de recuperação FULL?
Em particular, esta citação confirma o comportamento de um modelo de recuperação "pseudo simples":
Kimberly Tripp elabora o tópico aqui: Melhores práticas de manutenção de banco de dados Parte III – Manutenção de log de transações
Não concordo totalmente com sua afirmação " Nada remotamente simples sobre isso " em relação ao backup do log de transações falhando no modelo de recuperação FULL anterior a um backup FULL. Isso é como o modelo SIMPLE (backups de log não são permitidos). A mensagem de erro é diferente porque está tentando informar ao usuário final como resolver o problema.
Tentei seu teste no SQL Server 2017 e a execução do backup somente cópia aciona consistentemente um interno
CHECKPOINT
e limpa o log (PercentFree
aumenta para o arquivo de log).Na execução inicial,
PercentFree
do arquivo _log é65.04
.Executei o backup somente de cópia e
PercentFree
pulei para88.68
.Confirmei com a seguinte sessão de eventos estendidos que um
CHECKPOINT
foi executado neste momento também.Pseudo-simples significa que um banco de dados no modelo de recuperação completa se comportará como se estivesse no modelo de recuperação simples até que o primeiro backup completo seja feito (o último número de sequência de log do qual foi feito backup é registrado).
Em outras palavras, um banco de dados que está no modelo de recuperação completa requer uma cadeia de backup válida, e uma cadeia de backup válida requer um backup completo para dar o pontapé inicial. Em seguida, você pode realizar backups de log e diferenciais em paralelo ao conteúdo do seu coração, cada um deles baseado nesse backup completo inicial.
Como você viu nos scripts executados, não havia nenhuma cadeia de backup estabelecida até que você executasse seu backup completo (somente cópia). Depois que isso foi executado, você iniciou uma cadeia de backup, mas, como fez um backup somente de cópia, confundiu as coisas.
Os backups diferenciais são um atalho para reduzir o número de backups de log que você precisa restaurar para um momento específico. Eles dependem de um backup completo que não
COPY ONLY
seja , porque o backup somente cópia não redefine o bitmap diferencial usado para rastrear quais extensões foram modificadas desde o último backup completo.Se você tivesse feito um backup completo padrão (sem
COPY ONLY
), seu diferencial teria sido bem-sucedido e o banco de dados não estaria mais no estado pseudo-simples. Ficou ainda mais confuso pelo fato de que um backup diferencial também teria falhado em um banco de dados no modelo de recuperação simples sem um backup completo (sem cópia) para iniciar a cadeia.Eu ( OP na pergunta ) não sabia por que "Pseudo-Simple SQL Server Recover" estava funcionando conforme definido em várias postagens, mas não estava vendo no meu sistema com esses testes.
Na fase de pesquisa, coloquei o banco de dados
SIMPLE
e recriei o teste, o tamanho do arquivo de log usado cresceu da mesma forma que emFULL
, isso sugeriu algo com Durabilidade de Transação de Controle , mas testes posteriores descartaram isso.Depois de mais pesquisas e testes, descobri! ( Obrigado a um colega de trabalho que me ajudou a resolver o problema. )
COPY ONLY
backup.COPY ONLY
e o espaço usado caiu para 2 MB, com o primeiro VLF retornando ao status 0 e o segundo VLF mantendo os últimos 2 MB.
Informações relacionadas falando sobre VLFs: Muitos VLFs - Como faço para truncá-los?