如何在SQL Server中收缩简单恢复日志文件

时间:2014-11-26 19:16:38

标签: sql sql-server

我遇到了问题,

大型数据库上的日志文件不断变大。它设置为简单恢复,现在日志文件大40GB。

它到达了它填满硬盘的阶段,当我尝试在数据库中删除较旧的行时,它会尝试将此记录到日志文件中,并且它无法导致硬盘已满,因此无法删除条目。

那我该怎么办?

报废/删除/清空当前日志文件,我不需要其中的数据。

或b:

以不在日志文件中记录的方式从表中删除?

我试过了:

DBCC SHRINKFILE(FSK_LoggingServer__log, 200);
GO

但它会返回:

bdid, FieldId, CurrentSize, MinimumSize, UsedPages, EstimatedPages
32  2   4292352 512 4292352 512

并且它不会缩小文件。

1 个答案:

答案 0 :(得分:0)

听起来你可能有一个长时间运行的查询阻止日志被截断。试试这个:

DECLARE @LT TABLE
        (
          spid INT ,
          ttext VARCHAR(MAX) ,
          TranBeginTime DATETIME
        )
    DECLARE @CaptureDate DATETIME = DATEADD(minute,DATEDIFF(minute, 0, DATEADD(second, 30 - DATEPART(second, GETDATE() + '00:00:30.000'), GETDATE())), 0)

    INSERT  INTO @LT
            ( spid ,
              ttext ,
              TranBeginTime
            )
            SELECT  sessions.session_id ,
                    statements.text ,
                    at.transaction_begin_time
            FROM    sys.dm_tran_database_transactions db_trans
                    JOIN sys.dm_tran_session_transactions sessions ON db_trans.transaction_id = sessions.transaction_id
                    JOIN sys.dm_exec_connections conns ON conns.session_id = sessions.session_id
                    LEFT OUTER JOIN sys.dm_tran_active_transactions at ON db_trans.transaction_id = at.transaction_id
                    CROSS APPLY sys.dm_exec_sql_text(conns.most_recent_sql_handle)
                    AS statements
            WHERE   at.transaction_begin_time < DATEADD(Minute,-30,GETDATE())

    CREATE TABLE #sp_who2
        (
          SPID INT ,
          Status VARCHAR(1000) NULL ,
          Login SYSNAME NULL ,
          HostName SYSNAME NULL ,
          BlkBy SYSNAME NULL ,
          DBName SYSNAME NULL ,
          Command VARCHAR(1000) NULL ,
          CPUTime INT NULL ,
          DiskIO INT NULL ,
          LastBatch VARCHAR(1000) NULL ,
          ProgramName VARCHAR(1000) NULL ,
          SPID2 INT ,
          RequestID INT NULL ,
          rundate DATETIME DEFAULT ( GETDATE() )
        ) 


    INSERT  INTO #sp_who2
            ( SPID ,
              Status ,
              Login ,
              HostName ,
              BlkBy ,
              DBName ,
              Command ,
              CPUTime ,
              DiskIO ,
              LastBatch ,
              ProgramName ,
              SPID2 ,
              RequestID
            )
            EXEC sp_who2


            SELECT  who.SPID ,
                    who.login ,
                    who.HostName ,
                    who.DBName ,
                    DATEDIFF(SECOND, LT.TranBeginTime, GETDATE()) AS elapsedseconds ,
                    who.ProgramName ,
                    'Transaction' AS notetype ,
                    LT.ttext
            FROM    #sp_who2 who
                    INNER JOIN @LT LT ON LT.spid = who.SPID

是否会返回任何结果?