經常在csdn上看到網友發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題:
/*--壓縮資料庫的通用儲存過程
壓縮日誌及資料庫檔案大小
因為要對資料庫進行分離處理
所以儲存過程不能建立在被壓縮的資料庫中
--鄒建 2004.03(引用請保留此資訊)--*/
/*--呼叫示例
exec p_compdb 'test'
--*/
use master --注意,此儲存過程要建在master資料庫中
goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[p_compdb]') and objectproperty(id, n'isprocedure') = 1)
drop procedure [dbo].[p_compdb]
gocreate 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
endclose tb
deallocate tb
--附加資料庫
壓縮資料庫日誌
經常在csdn上看到發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題 壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.03 引用請保留此...
壓縮資料庫日誌
經常在csdn上看到發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題 壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.03 引用請保留此...
壓縮資料庫日誌
壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.03 引用請保留此資訊 呼叫示例 exec p compdb test use master 注意,此儲存過程要建在master資料庫中go if exists s...