Estou tentando criar um script para obter o nome do arquivo de log de um banco de dados, definir como recuperação simples, reduzir o arquivo de log desse banco de dados e definir novamente como completo.
Até agora, eu criei este script:
DECLARE @RestoreDbName nvarchar(2000);
declare @Name nvarchar(2000)
set @restoreDbName = 'dbname'
DECLARE cur CURSOR FOR
SELECT name
FROM [sys].[database_files]
where [type] = 1 and name like @restoreDbName
ALTER DATABASE @RestoreDbName
SET RECOVERY SIMPLE;
GO
OPEN cur
FETCH NEXT FROM cur INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC SHRINKFILE(@Name, 1)
FETCH NEXT FROM cur INTO @Name
END
CLOSE cur
DEALLOCATE cur
GO
ALTER DATABASE @RestoreDbName
SET RECOVERY FULL;
GO
O script será executado a partir de um PowerShell, não gera nenhuma mensagem de erro, mas quando verifico o arquivo de log do banco de dados continua o mesmo de antes, não foi reduzido.
Alguma sugestão, o que estou fazendo errado?
Você precisa confirmar se o resultado da seguinte declaração é verdadeiro
NOTHING
antes de tentar reduzir o log.Se não for,
NOTHING
então algo está segurando o log e impedindo o truncamento. Veja este post .Você também deve considerar por que o log ficou tão grande em primeiro lugar: se você não precisa de backups de log, então por que mantê-lo no
FULL
modo? E por que reduzi-lo se ele vai precisar de espaço novamente?Você também tem alguns problemas com seu script:
CHECKPOINT
depois da primeiraSET RECOVERY SIMPLE
declaração.ALTER DATABASE
não é parametrizável, então você precisa usar SQL dinâmico.database_files
consulta para obter apenas os arquivos de log.STATIC
cursores em visualizações do sistema, pois eles podem ser instáveis.