我想重新设置数据库的日志文件初始大小,因为在设置数据库时它会设置非常大的值(40G)。当我想缩小它时,它的大小也会等于初始大小。
我尝试将此SQL与SIZE参数一起使用来设置:
ALTER DATABASE [DBNAME] MODIFY FILE ( NAME = N'DBNAME_log', SIZE=1MB, MAXSIZE = 2048GB)
GO
不幸的是,只收到错误消息:
MODIFY FILE失败。指定的大小小于或等于当前 大小
似乎尺寸参数需要大于当前尺寸。
以下是总结的问题:
如何重新设置数据库的文件初始大小?无论当前文件大小如何,它都需要足够小。
我知道我的数据库名[DBNAME]并且可以使用SQL获取其相关的日志文件名:
DECLARE @logname NVARCHAR(100); SELECT @logname = name FROM sys.database_files WHERE type_desc = 'LOG'
但为什么 NOT 使用结果@logname输入数据库名称,如:
ALTER DATABASE [OrderTracker] MODIFY FILE (*NAME = @logname*, size=1MB, MAXSIZE = 2048GB)
答案 0 :(得分:0)
如何重新设置数据库的文件初始大小?无论当前文件大小如何,它都需要足够小
带有MODIFY FILE命令的ALTER DATABASE只能使文件大小更大,所以如果你需要减小文件大小,你需要使用DBCC SHRINKFILE。
我不建议收缩,但如果没办法,你可以使用如下命令
dbcc shrinkfile('test_log_log',1)--we are asking to shrink log to 1 mb
如果您已经备份并且日志文件为空并且位于日志末尾的VLF未激活(2处于活动状态,0处于非活动状态)..那么您可以缩小
您可以使用dbcc loginfo
来了解vlf的状态,这应该在同一个数据库上运行
答案 1 :(得分:0)
问题是,您不能使用MODIFY FILE
缩小到2MB以下。
当您传入0MB时,DBCC SHRINKFILE
中没有没有验证逻辑。
它只是将其缩小到1MB。我认为,因为您不能将0MB增加10%,所以默认将0MB设置为1MB。
MODIFY FILE
中的验证逻辑将不允许您将大小设置为等于当前大小(在这种情况下为1MB)。
因此,您不能通过MODIFY FILE
使用少于2MB的内存。
顺便说一句:Initial Size
的1MB太低了。
是的,您可以使用SSMS界面将其设置为1MB,但是如果您希望编写脚本,那么1MB的差异会很糟糕吗?
以下是如何生成将要运行的脚本的示例:
--Identify Log Files that Require Shrinking and Generate Scripts:
SELECT D.name[DatabaseName], F.name[FileName], F.physical_name[FilePath], F.type_desc[FileType],
D.recovery_model_desc[RecoveryModel],
(F.size * 8)[SizeKB], CAST((F.size * 8 / 1024.0) as Decimal(11,1))[SizeMB],
('USE ' + QUOTENAME(D.name) + ' DBCC SHRINKFILE (' + QUOTENAME(F.name) + ', 98)')[Shrink],
('ALTER DATABASE ' + QUOTENAME(D.name) + ' MODIFY FILE (NAME = '
+ QUOTENAME(F.name) + ', SIZE = 100MB)')[Resize]
FROM sys.master_files as F
JOIN sys.databases as D
ON D.database_id = F.database_id
WHERE F.type_desc = 'LOG'
--AND D.database_id > 4--Filter out System Databases. - 01/28/2020 - MCR.
AND D.recovery_model_desc != 'FULL'--Shrink will not work on databases with Full Recovery.
AND (F.size * 8 / 1024) > 100--Larger than 100MB's. - 01/28/2020 - MCR.
ORDER BY D.name, F.name
我使用100MB作为目标文件大小,因为我们使用的是大型数据库。
不要使用99MB作为您的缩小大小,因为我发现SQL的验证存在舍入问题,
因此请始终减去-2来确定您的缩小大小(在这种情况下为98MB)。
注意:如果使用的是“ 完整 ”恢复模型,则需要先备份整个数据库,然后再立即备份日志,它们应该自动截短。或者,可以根据需要备份日志两次或多次。