zoukankan      html  css  js  c++  java
  • [转]压缩数据库日志

    转自 http://topic.csdn.net/t/20040406/13/2931507.html

    --压缩日志及数据库文件大小 

    /*--特别注意 
    请按步骤进行,未进行前面的步骤,请不要做后面的步骤 
    否则可能损坏你的数据库. 
    --*/ 

    1.清空日志 
    DUMP     TRANSACTION     库名     WITH     NO_LOG         

    2.截断事务日志: 
    BACKUP   LOG   数据库名   WITH   NO_LOG 

    3.收缩数据库文件(如果不压缩,数据库的文件不会减小 
    企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 
    --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 
    --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 

    也可以用SQL语句来完成 
    --收缩数据库 
    DBCC   SHRINKDATABASE(客户资料) 

    --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles 
    DBCC   SHRINKFILE(1) 

    4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行) 
    a.分离数据库: 
    企业管理器--服务器--数据库--右键--分离数据库 

    b.在我的电脑中删除LOG文件 

    c.附加数据库: 
    企业管理器--服务器--数据库--右键--附加数据库 

    此法将生成新的LOG,大小只有500多K 

    或用代码:   
    下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。 

    a.分离 
    EXEC   sp_detach_db   @dbname   =   'pubs ' 

    b.删除日志文件 

    c.再附加 
    EXEC   sp_attach_single_file_db   @dbname   =   'pubs ',   
          @physname   =   'c:\Program   Files\Microsoft   SQL   Server\MSSQL\Data\pubs.mdf ' 

    5.为了以后能自动收缩,做如下设置: 
    企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 " 

    --SQL语句设置方式: 
    EXEC   sp_dboption   '数据库名 ',   'autoshrink ',   'TRUE '

    6.如果想以后不让它日志增长得太大 
    企业管理器--服务器--右键数据库--属性--事务日志 
    --将文件增长限制为xM(x是你允许的最大数据文件大小) 

    --SQL语句的设置方式: 
    alter   database   数据库名   modify   file(name=逻辑文件名,maxsize=20) 

    --下面是压缩处理的存储过程,你可以定期调用这个存储过程完成压缩日志的操作. 

    use   master     --注意,此存储过程要建在master数据库中 
    go 

    if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[p_compdb] ')   and   OBJECTPROPERTY(id,   N 'IsProcedure ')   =   1) 
    drop   procedure   [dbo].[p_compdb] 
    GO 

    /*--压缩数据库的通用存储过程 

    压缩日志及数据库文件大小 
    因为要对数据库进行分离处理 
    所以存储过程不能创建在被压缩的数据库中 

    --邹建   2004.3--*/ 

    /*--调用示例 
    exec   p_compdb   'test ' 
    --*/ 
    create   proc   p_compdb 
    @dbname   sysname, --要压缩的数据库名 
    @bkdatabase   bit=1, --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库 
    @bkfname   nvarchar(260)= ' ' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间 
    as 
    if   @bkdatabase=1 --确定是否备份数据库 
    begin 
    if   isnull(@bkfname, ' ')= ' '   
    set   @bkfname=@dbname+ '_ '+convert(varchar,getdate(),112) 
    +replace(convert(varchar,getdate(),108), ': ', ' ') 
    select   提示信息= '备份数据库到SQL   默认备份目录,备份文件名: '+@bkfname 
    exec( 'backup   database   [ '+@dbname+ ']   to   disk= ' ' '+@bkfname+ ' ' ' ') 
    end 

    --1.清空日志 
    exec( 'DUMP   TRANSACTION   [ '+@dbname+ ']   WITH     NO_LOG ') 

    --2.截断事务日志: 
    exec( 'BACKUP   LOG   [ '+@dbname+ ']   WITH   NO_LOG ') 

    --3.收缩数据库文件(如果不压缩,数据库的文件不会减小 
    exec( 'DBCC   SHRINKDATABASE([ '+@dbname+ ']) ') 

    --4.设置自动收缩 
    exec( 'EXEC   sp_dboption   ' ' '+@dbname+ ' ' ', ' 'autoshrink ' ', ' 'TRUE ' ' ') 

    /*--后面的步骤有一定危险,如果你无法确定它的危险性,请勿启用 
    --5.分离数据库 

    --进行分离处理 
    create   table   #t(fname   nvarchar(260),type   int) 
    exec( 'insert   into   #t   select   filename,type=status&0x40   from   [ '+@dbname+ ']..sysfiles ') 
    exec( 'sp_detach_db   ' ' '+@dbname+ ' ' ' ') 

    --删除日志文件 
    declare   @fname   nvarchar(260),@s   varchar(8000) 
    declare   tb   cursor   local   for   select   fname   from   #t   where   type=64 
    open   tb   
    fetch   next   from   tb   into   @fname 
    while   @@fetch_status=0 
    begin 
    set   @s= 'del   " '+rtrim(@fname)+ ' " ' 
    exec   master..xp_cmdshell   @s,no_output 
    fetch   next   from   tb   into   @fname 
    end 
    close   tb 
    deallocate   tb 

    --附加数据库 
    set   @s= ' ' 
    declare   tb   cursor   local   for   select   fname   from   #t   where   type=0 
    open   tb   
    fetch   next   from   tb   into   @fname 
    while   @@fetch_status=0 
    begin 
    set   @s=@s+ ', ' ' '+rtrim(@fname)+ ' ' ' ' 
    fetch   next   from   tb   into   @fname 
    end 
    close   tb 
    deallocate   tb 
    exec( 'sp_attach_single_file_db   ' ' '+@dbname+ ' ' ' '+@s) 
    --*/ 
    go 

  • 相关阅读:
    MaxScript 计算执行时间差
    MaxScript 几种类GUID的生成方法
    MaxScript 防坑规范指南
    样式测试
    设置.MAX文件程序关联
    Python相关网站(持续更新)
    Python程序使用cx_freeze打包(报错)
    Python对Excel的操作(模块win32com)
    Python对Excel的操作(模块xlrd)
    python模块安装
  • 原文地址:https://www.cnblogs.com/21xz/p/2235802.html
Copyright © 2011-2022 走看看