SQLServer alter database修改文件问题

时间:2017-09-27 06:45:45

标签: sql-server tsql

我想重新设置数据库的日志文件初始大小,因为在设置数据库时它会设置非常大的值(40G)。当我想缩小它时,它的大小也会等于初始大小。

我尝试将此SQL与SIZE参数一起使用来设置:

ALTER DATABASE [DBNAME] MODIFY FILE ( NAME = N'DBNAME_log', SIZE=1MB, MAXSIZE = 2048GB)
GO

不幸的是,只收到错误消息:

  

MODIFY FILE失败。指定的大小小于或等于当前   大小

似乎尺寸参数需要大于当前尺寸。

以下是总结的问题:

  1. 如何重新设置数据库的文件初始大小?无论当前文件大小如何,它都需要足够小。

  2. 我知道我的数据库名[DBNAME]并且可以使用SQL获取其相关的日志文件名:

    DECLARE @logname NVARCHAR(100); SELECT @logname = name FROM sys.database_files WHERE type_desc = 'LOG'

  3. 但为什么 NOT 使用结果@logname输入数据库名称,如:

    ALTER DATABASE [OrderTracker] MODIFY FILE (*NAME = @logname*, size=1MB, MAXSIZE = 2048GB)
    

2 个答案:

答案 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)。

注意:如果使用的是“ 完整 ”恢复模型,则需要先备份整个数据库,然后再立即备份日志,它们应该自动截短。或者,可以根据需要备份日志两次或多次。