【问题标题】:How to shrink a log file where 89.5% is unused如何缩小未使用 89.5% 的日志文件
【发布时间】:2020-01-10 16:26:46
【问题描述】:

我目前有一个 27.6GB 的日志文件,其中 89.5 未使用。使用 10.5%。我不知道在下面的 DataFile1 示例之后使用什么值。欢迎任何帮助或建议。

USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO

【问题讨论】:

标签: sql sql-server logging


【解决方案1】:

使用您要收缩的日志文件的名称,您可以这样发现:

select file_id, type_desc, name, physical_name
from sys.database_files

一个数据库通常只有一个日志文件。例如

file_id     type_desc                                                    name
----------- ------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------
1           ROWS                                                         AdventureWorksDW2017
2           LOG                                                          AdventureWorksDW2017_log

(2 rows affected)

然后

DBCC SHRINKFILE (N'AdventureWorksDW2017_log' , 0, TRUNCATEONLY)

将尝试将日志文件缩小到其初始创建大小。如果文件末尾附近有已使用的日志段,或者总使用空间更大,则不会缩小那么多。

但是,您不应该经常这样做,因为您不希望日志文件在数据库处于活动状态时增长。日志文件增长代价高昂,因为文件必须归零,并且所有需要提交事务的会话都必须等待操作完成。

【讨论】:

    【解决方案2】:

    这是我用来获取日志文件大小的脚本。

    IF OBJECT_ID('tempdb..#tmplogspace') IS NOT NULL DROP TABLE #tmplogspace
    
    CREATE table #TmpLOGSPACE  
    (
    DatabaseName varchar(100),
    LOGSIZE_MB decimal(18, 9),
    LOGSPACE_USED decimal(18, 9),
    LOGSTATUS decimal(18, 9)
    ) 
    
    INSERT INTO #TmpLOGSPACE(DatabaseName, LOGSIZE_MB, LOGSPACE_USED, LOGSTATUS) 
    EXEC('DBCC SQLPERF(LOGSPACE);')
    
    SELECT * FROM #TmpLOGSPACE
    ORDER BY LOGSIZE_MB DESC
    

    查看相关数据库的大小和百分比。然后运行:

    USE My_Database
    GO
    
    DBCC SHRINKFILE (2,20000)  -- 2 is for log file, last number is 20G, which should be a safe start.  Change as desired MB size
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2013-12-04
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多