我正在尝试创建一个脚本来获取数据库日志文件的名称,设置为简单恢复,从该数据库收缩日志文件并重新设置为完整。
到目前为止,我已经想出了这个脚本:
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
该脚本将从 powershell 运行,不会给出任何错误消息,但是当我检查数据库的日志文件时仍然与以前一样,并没有缩小。
有什么建议吗?我做错了什么?
NOTHING
在尝试收缩日志之前,您需要确认以下语句的结果。如果不是
NOTHING
,那么有东西会阻碍日志并阻止截断。请参阅此帖子。您还应该首先考虑日志为何变得如此之大:如果您不需要日志备份,那么为什么要将其保持在
FULL
模式中?如果它再次需要空间,为什么要缩小它?您的脚本还存在一些问题:
CHECKPOINT
在第一条语句后添加SET RECOVERY SIMPLE
。ALTER DATABASE
不可参数化,因此需要使用动态 SQL。database_files
以仅获取日志文件。STATIC
游标,因为它们可能不稳定。