CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

数据库日志问题

楼主tmpx(沙漠之鹰)2005-11-18 10:59:32 在 MS-SQL Server / 基础类 提问

SET   NOCOUNT   ON  
  DECLARE   @LogicalFileName   sysname,  
                  @MaxMinutes   INT,  
                  @NewSize   INT  
   
   
  USE           Marias                           --   要操作的数据库名  
  SELECT     @LogicalFileName   =   'Marias_log',     --   日志文件名  
  @MaxMinutes   =   10,                               --   Limit   on   time   allowed   to   wrap   log.  
                  @NewSize   =   100                                     --   你想设定的日志文件的大小(M)  
   
  --   Setup   /   initialize  
  DECLARE   @OriginalSize   int  
  SELECT   @OriginalSize   =   size    
      FROM   sysfiles  
      WHERE   name   =   @LogicalFileName  
  SELECT   'Original   Size   of   '   +   db_name()   +   '   LOG   is   '   +    
                  CONVERT(VARCHAR(30),@OriginalSize)   +   '   8K   pages   or   '   +    
                  CONVERT(VARCHAR(30),(@OriginalSize*8/1024))   +   'MB'  
      FROM   sysfiles  
      WHERE   name   =   @LogicalFileName  
  CREATE   TABLE   DummyTrans  
      (DummyColumn   char   (8000)   not   null)  
   
   
  DECLARE   @Counter       INT,  
                  @StartTime   DATETIME,  
                  @TruncLog     VARCHAR(255)  
  SELECT     @StartTime   =   GETDATE(),  
                  @TruncLog   =   'BACKUP   LOG   '   +   db_name()   +   '   WITH   TRUNCATE_ONLY'  
   
  DBCC   SHRINKFILE   (@LogicalFileName,   @NewSize)  
  EXEC   (@TruncLog)  
  --   Wrap   the   log   if   necessary.  
  WHILE           @MaxMinutes   >   DATEDIFF   (mi,   @StartTime,   GETDATE())   --   time   has   not   expired  
              AND   @OriginalSize   =   (SELECT   size   FROM   sysfiles   WHERE   name   =   @LogicalFileName)      
              AND   (@OriginalSize   *   8   /1024)   >   @NewSize      
      BEGIN   --   Outer   loop.  
          SELECT   @Counter   =   0  
          WHILE     ((@Counter   <   @OriginalSize   /   16)   AND   (@Counter   <   50000))  
              BEGIN   --   update  
                  INSERT   DummyTrans   valueS   ('Fill   Log')      
                  DELETE   DummyTrans  
                  SELECT   @Counter   =   @Counter   +   1  
              END        
          EXEC   (@TruncLog)      
      END        
  SELECT   'Final   Size   of   '   +   db_name()   +   '   LOG   is   '   +  
                  CONVERT(VARCHAR(30),size)   +   '   8K   pages   or   '   +    
                  CONVERT(VARCHAR(30),(size*8/1024))   +   'MB'  
      FROM   sysfiles    
      WHERE   name   =   @LogicalFileName  
  DROP   TABLE   DummyTrans  
  SET   NOCOUNT   OFF  
   
  请问这么做会不会造成一部分日志的丢失? 问题点数:40、回复次数:5Top

1 楼churchatp1(别看资料,看聊效!)回复于 2005-11-18 11:09:29 得分 10

你的数据库恢复模式是什么?  
  是完全的话应该不会  
  简单的话就会Top

2 楼churchatp1(别看资料,看聊效!)回复于 2005-11-18 11:09:47 得分 10

其实也不是丢失  
  只不过记录的详细程度有差别Top

3 楼zhangjian01361(★非也非也★)回复于 2005-11-18 11:34:58 得分 5

这个方法太复杂了,去找个简单的.  
  比如分离数据库Top

4 楼tmpx(沙漠之鹰)回复于 2005-11-18 15:05:26 得分 0

分离数据库然后删除日志的话以后万一出了问题要恢复怎么办?Top

5 楼whbo(王红波(年轻人,要有所作为))回复于 2005-11-18 15:08:33 得分 15

使用收缩数据库    
  *--压缩数据库的通用存储过程    
   
  压缩日志及数据库文件大小    
  因为要对数据库进行分离处理    
  所以存储过程不能创建在被压缩的数据库中    
   
  --邹建   2004.3--*/    
   
  /*--调用示例    
  exec   p_compdb   'test'    
  --*/    
   
  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    
   
  create   proc   p_compdb    
  @dbname   sysname,   --要压缩的数据库名    
  @bkdatabase   bit=1,   --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库    
  @bkfname   nvarchar(260)=''   --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间    
  as    
  --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.分离数据库    
  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    
   
  --进行分离处理    
  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)    
  goTop

相关问题

  • 数据库日志问题?
  • 数据库日志问题
  • 数据库日志问题
  • 怎么删数据库的日志?
  • 数据库日志满了怎么办?
  • 关于数据库日志的问题
  • 数据库日志的问题?
  • 如何收缩数据库日志
  • 关于数据库的日志文件?
  • 数据库日志满了怎么办?如何删掉日志?

关键词

  • 日志
  • originalsize
  • trunclog
  • logicalfilename
  • newsize
  • varchar
  • log

得分解答快速导航

  • 帖主:tmpx
  • churchatp1
  • churchatp1
  • zhangjian01361
  • whbo

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo