zoukankan      html  css  js  c++  java
  • sqlserver中压缩日志文件

        最近在转移数据,sqlserver的日志文件ldf,占用空间特别大,为了还原库,节省空间,所以压缩日志文件迫在眉睫。在网上找了一段代码:

     1 USE [master]
     2 GO
     3 ALTER DATABASE AFMS SET RECOVERY SIMPLE WITH NO_WAIT
     4 GO
     5 ALTER DATABASE AFMS SET RECOVERY SIMPLE
     6 GO
     7 USE AFMS
     8 GO
     9 DBCC SHRINKFILE (N'AFMS_Log' , 11, TRUNCATEONLY)
    10 GO
    11 USE [master]
    12 GO
    13 ALTER DATABASE AFMS SET RECOVERY FULL WITH NO_WAIT
    14 GO
    15 ALTER DATABASE AFMS SET RECOVERY FULL
    16 GO

      把数据库名称替换成自己的数据库即可,还真的可以压缩,我几个G的数据量直接压缩到了11M大小,我很是惊讶。那么我们先来理解下 DBCC SHRINKFILE 命令,它的语法如下:

    DBCC SHRINKFILE
        file_name | file_id }
            { [ ,target_size ]
                | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] 
            }
        )

    参数

    file_name

    是已收缩文件的逻辑名称。文件名必须符合标识符的规则。

    file_id

    是要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles

    target_size

    是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,DBCC SHRINKFILE 将文件大小减少到默认文件大小。

    EMPTYFILE

    将所有数据从指定文件中迁移到同一文件组中的其它文件

    NOTRUNCATE

    导致将释放的文件空间保留在文件中。

    TRUNCATEONLY

    导致文件中的任何未使用的空间释放给操作系统,并将文件收缩到上一次分配的大小,从而减少文件大小,而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY,将忽略 target_size

    看了这个解释,是不是对这个命令有所了解呢?

    如果对日志文件的逻辑名称不清楚的话,用下面这句sql可以直接查出来:

    SELECT file_id, name FROM sys.database_files 

    如果我们要压缩多个数据库日志文件,用上面的命令一一执行的话,于是就产生了好多个Ctrl+C、Ctrl+V,这不符合“Don't Repeat YourSelf”原则。看看我改进后的代码:

     1 declare @dbName varchar(20)
     2 declare @dbNamelog varchar(20)
     3 
     4 
     5 select @dbName='NF_Group'
     6 select @dbNamelog='NF_Group_log'
     7 
     8 
     9 declare @sql nvarchar(2000)
    10 
    11 set @sql='
    12 
    13 USE '+@dbName+'
    14 
    15 ALTER DATABASE '+@dbName+' SET RECOVERY SIMPLE WITH NO_WAIT
    16 
    17 ALTER DATABASE '+@dbName+' SET RECOVERY SIMPLE
    18 
    19 USE '+@dbName+'
    20 
    21 DBCC SHRINKFILE (N'''+@dbNamelog+''' , 11, TRUNCATEONLY)
    22 
    23 USE '+@dbName+'
    24 
    25 ALTER DATABASE '+@dbName+' SET RECOVERY FULL WITH NO_WAIT
    26 
    27 ALTER DATABASE '+@dbName+' SET RECOVERY FULL
    28 
    29 
    30 
    31 SELECT file_id, name FROM sys.database_files'
    32 
    33 exec(@sql)

    这个就是sql中传说中的动态执行字符串,当然需要拼凑语句。

       

  • 相关阅读:
    session绑定javaBean
    Some code changes cannot be hot swapped into a running virtual machine,
    抓包及WireShark工具介绍
    Jquery选择器特殊字符问题
    win7,win8 64位 VS2010/VS2013调试报错
    win7x64 连接oracle 客户端 VS2010调试 提示ORA-12154 TNS
    WebService本地VS运行正常,发布到IIS异常
    SQL语句增、删、改
    vb 去掉html中的回车和tab;转换部分html大写标签为小写
    C#语句——循环语句(for循环与for循环嵌套)
  • 原文地址:https://www.cnblogs.com/wangqiang3311/p/7687073.html
Copyright © 2011-2022 走看看