• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL Server无法收缩日志文件的原因分析及解决办法

    最近服务器执行收缩日志文件大小的job老是报错

    我所用的一个批量收缩日志脚本

    USE [master]
    GO
    /****** Object: StoredProcedure [dbo].[ShrinkUser_DATABASESLogFile] Script Date: 01/05/2016 09:52:39 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROC [dbo].[ShrinkUser_DATABASESLogFile]
    AS
    BEGIN
     DECLARE @DBNAME NVARCHAR(MAX)
    DECLARE @SQL NVARCHAR(MAX)
    --临时表保存数据
    CREATE TABLE #DataBaseServerData
    (
     ID INT IDENTITY(1, 1) ,
     DBNAME NVARCHAR(MAX) ,
     Log_Total_MB DECIMAL(18, 1) NOT NULL ,
     Log_FREE_SPACE_MB DECIMAL(18, 1) NOT NULL 
    )
    --游标
    DECLARE @itemCur CURSOR
    SET 
    @itemCur = CURSOR FOR 
    SELECT name from SYS.[databases] WHERE [name] NOT IN ('MASTER','MODEL','TEMPDB','MSDB','ReportServer','ReportServerTempDB','distribution')
    and state=0
    OPEN @itemCur
    FETCH NEXT FROM @itemCur INTO @DBNAME
    WHILE @@FETCH_STATUS = 0
     BEGIN
     SET @SQL=N'USE ['+@DBNAME+'];'+CHAR(10)
     +'
      DECLARE @TotalLogSpace DECIMAL(18, 1)
      DECLARE @FreeLogSpace DECIMAL(18, 1)
      DECLARE @filename NVARCHAR(MAX)
      DECLARE @CanshrinkSize BIGINT
      DECLARE @SQL1 nvarchar(MAX)
    SELECT @TotalLogSpace=(SUM(CONVERT(dec(17, 2), sysfiles.size)) / 128) 
      FROM dbo.sysfiles AS sysfiles WHERE [groupid]=0
    SELECT @FreeLogSpace = ( SUM(( size - FILEPROPERTY(name, ''SpaceUsed'') )) )/ 128.0
      FROM sys.database_files
      WHERE [type] = 1
    SELECT @filename=name FROM sys.database_files WHERE [type]=1
    SET @CanshrinkSize=CAST((@TotalLogSpace-@FreeLogSpace) AS BIGINT)
     SET @SQL1 = ''USE ['+@DBNAME+']''
    SET @SQL1 = @SQL1+
     ''DBCC SHRINKFILE (['' + @filename + ''],'' + CAST(@CanshrinkSize+1 AS NVARCHAR(MAX)) + '')''
     EXEC (@SQL1)'
     EXEC (@SQL)
      FETCH NEXT FROM @itemCur INTO @DBNAME
     END 
    CLOSE @itemCur
    DEALLOCATE @itemCur
    SELECT * FROM [#DataBaseServerData]
    DROP TABLE [#DataBaseServerData]
    END 

    幸亏报错信息还是很全面,根据报错信息找到相关的数据库,执行一下DBCC LOGINFO

    dbcc loginfo(N'cdb')

    发现确实只有两个VLF文件,不能再收缩了,因为是批量脚本,当其中有一个库失败之后,后续的库就不会再进行收缩操作

    这里只要加上数据库的VLF数量的判断就可以了

    本文写的不好,还请各位大侠提出宝贵意见,如有好的解决方案欢迎分享,大家共同学习进步。

    您可能感兴趣的文章:
    • Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法
    • SQL SERVER 2008数据库日志文件收缩的方法
    • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
    • SQL SERVER日志进行收缩的图文教程
    上一篇:实例详解Group by和Having子句
    下一篇:SQL语句优化提高数据库性能
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL Server无法收缩日志文件的原因分析及解决办法 SQL,Server,无法,收缩,日志,