| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 547 人关注过本帖
标题:[原创]怎么清除sql server日志
只看楼主 加入收藏
xiuyuan123
Rank: 2
等 级:新手上路
威 望:3
帖 子:140
专家分:0
注 册:2006-4-25
收藏
 问题点数:0 回复次数:2 
[原创]怎么清除sql server日志

第一步:
backup log database_name with no_log
或者 backup log database_name with truncate_only --no_log和truncate_only是在这里是同义的,随便执行哪一句都可以
第二步:
1.收缩特定数据库的所有数据和日志文件,执行 dbcc shrinkdatabase (database_name,[,target_percent])--database_name是要收缩的数据库名称;target_percent是数据库收缩后的数据库文件中所要的剩余可用空间百分比
2.收缩一次一个特定数据库中的数据或日志文件,执行 dbcc shrinkfile(file_id,[,target_size]) --file_id是要收缩的文件的标识 (ID) 号,若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles;target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,dbcc shrinkfile 将文件大小减少到默认文件大小

两个dbcc都可以带上参数notruncate或truncateonly,具体意思看帮助。


方法2(这个方法在sqlserver2000的环境下做一般能成功,在sqlserver7及以下版本就不一定了):
第一步:
先备份整个数据库以备不测
第二步:
备份结束后,在Query Analyzer中执行如下的语句:
exec sp_detach_db yourDBName,true --卸除这个DB在MSSQL中的注册信息
第三步:
到日志的物理文件所在的目录中去删除该日志文件或者将该日志文件移出该目录
第四步:
在Query Analyzer中执行如下的语句:

exec sp_attach_single_file_db yourDBName,'d:\mssql7\data\yourDBName_data.mdf'
--以单文件的方式注册该DB,如果成功则MSSQL将自动为这个DB生成一个500K的日志文件。

以上方法在清除log日志中均有效。
但,能否让sql server 不产生log日志呢?以上方法好像均无效。
我这儿正好有个case:
我客户的sql server每天都会产生4,500M的log日志,每天都清除一下,非常不便。有没有办法实现不产生log日志呢?

我分析了一下客户产生log日志的原因,并且做了相应测试。
客户是每天将数据库清空,从总系统中将数据导入到sql server里。我感决sqlserver在插入时产生log不大,在delete整个库时产生log极大。
比如:
SELECT * into test_2 from b_bgxx
共45000条记录,产生十几M log,如果
delete from test_2
产生80多M log ,这明显存在问题。

虽然可以换成:
truncate table test_2
但我还是希望能找到不产生log的方法。就如oracle不产生归档一样。

搜索更多相关主题的帖子: 日志 sql server 数据库 log 
2006-05-15 14:06
卜酷塔
Rank: 7Rank: 7Rank: 7
来 自:魅力青岛
等 级:禁止访问
威 望:39
帖 子:2569
专家分:0
注 册:2004-6-12
收藏
得分:0 
办法倒是不错,有简单的为什么不用呢?
dbcc shrinkfile 就可以奥!

觉得为时已晚的时候,恰恰是最早的时候。

2006-05-16 15:59
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

清除SQLSERVER日志文件

DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE szwzcheck -- 要操作的数据库名
SELECT @LogicalFileName = 'szwzcheck_Log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 20 -- 你想设定的日志文件的大小(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
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

把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。

乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-05-16 16:17
快速回复:[原创]怎么清除sql server日志
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019350 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved