MSSQL2000(2005)數(shù)據(jù)庫日志清理方式(命令)
[重要通告]如您遇疑難雜癥,本站支持知識付費業(yè)務,掃右邊二維碼加博主微信,可節(jié)省您寶貴時間哦!
MSSQL數(shù)據(jù)庫日志清理
日志文件滿而造成SQL數(shù)據(jù)庫無法寫入文件時,可用兩種方法:
一種方法:清空日志。
1.打開查詢分析器,輸入命令
DUMP TRANSACTION 數(shù)據(jù)庫名 WITH NO_LOG
2.再打開企業(yè)管理器--右鍵你要壓縮的數(shù)據(jù)庫--所有任務--收縮數(shù)據(jù)庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數(shù),直接輸入這個數(shù),確定就可以了。
另一種方法有一定的風險性,因為SQL SERVER的日志文件不是即時寫入數(shù)據(jù)庫主文件的,如處理不當,會造成數(shù)據(jù)的損失。
1、備份數(shù)據(jù)庫(以防萬一)
2、分離數(shù)據(jù)庫 企業(yè)管理器->服務器->數(shù)據(jù)庫->右鍵->分離數(shù)據(jù)庫
3、刪除LOG文件
4、附加數(shù)據(jù)庫 企業(yè)管理器->服務器->右鍵->附加數(shù)據(jù)庫
此法生成新的LOG,大小只有500多K。
另外的幾點建議:
--縮小SQL日志
-- exec 'test'
create proc p_compdb
@dbname sysname, --要壓縮的數(shù)據(jù)庫名
@bkdatabase bit=1, --因為分離日志的步驟中,可能會損壞數(shù)據(jù)庫,所以你可以選擇是否自動數(shù)據(jù)庫
@bkfname nvarchar(260)=' --備份的文件名,如果不指定,自動備份到默認備份目錄,備份文件名為:數(shù)據(jù)庫名+日期時間
as
--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')
--2.截斷事務日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')
--3.收縮數(shù)據(jù)庫文件(如果不壓縮,數(shù)據(jù)庫的文件不會減小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')
--4.設置自動收縮
exec('EXEC sp_dboption ''+@dbname+'','autoshrink','TRUE'')
--后面的步驟有一定危險,你可以可以選擇是否應該這些步驟
--5.分離數(shù)據(jù)庫
if @bkdatabase=1
begin
if isnull(@bkfname,')='
set @bkfname=@dbname+'_'+convert(varchar,getdate(),112)
+replace(convert(varchar,getdate(),108),':',')
select 提示信息='備份數(shù)據(jù)庫到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
--附加數(shù)據(jù)庫
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
注意:建議使用第一種方法。
如果以后,不想要它變大。
SQL2000下使用:
在數(shù)據(jù)庫上點右鍵->屬性->選項->故障恢復-模型-選擇-簡單模型。
或用SQL語句:
alter database 數(shù)據(jù)庫名 set recovery simple
另外,Truncate log on checkpoint(此選項用于SQL7.0,SQL 2000中即故障恢復模型選擇為簡單模型)當執(zhí)行CHECKPOINT 命令時如果事務日志文件超過其大小的70% 則將其內(nèi)容清除在開發(fā)數(shù)據(jù)庫時時常將此選項設置為True Auto shrink定期對數(shù)據(jù)庫進行檢查當數(shù)據(jù)庫文件或日志文件的未用空間超過其大小的25%時,系統(tǒng)將會自動縮減文件使其未用空間等于25% 當文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大于或等于其初始大小對事務日志文件的縮減只有在對其作備份時或?qū)runcate log on checkpoint 選項設為True 時才能進行。
注意:一般立成建立的數(shù)據(jù)庫默認屬性已設好,但碰到意外情況使數(shù)據(jù)庫屬性被更改,請用戶清空日志后,檢查數(shù)據(jù)庫的以上屬性,以防事務日志再次充滿
具體的操作我還沒有實驗過,如果你要使用請在使用前backup好的你數(shù)據(jù)庫.
問題未解決?付費解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!