日志文件太大,如何在數據庫運行的情況下壓縮日志文件?


我的數據庫,流量很大,有時候兩天內,日志文件就到了2G。
請問如何用代碼讓日志保持最小?
如何在企業管理器中,讓日志保持最小?

8 个解决方案

#1


1: 刪除LOG
1:分離數據庫   企業管理器->服務器->數據庫->右鍵->分離數據庫
2:刪除LOG文件
3:附加數據庫  企業管理器->服務器->數據庫->右鍵->附加數據庫
此法生成新的LOG,大小只有500多K
   再將此數據庫設置自動收縮
 或用代碼: 
下面的示例分離 pubs,然后將 pubs 中的一個文件附加到當前服務器。

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


2:清空日志
DUMP  TRANSACTION  庫名  WITH  NO_LOG    

再:
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了

3: 
企業管理器->服務器->數據庫->屬性->事務日志->將文件增長限制為2M

#2


--截斷日志:
backup log 數據庫 with no_log

再:
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了

#3


改庫為簡單恢復模型
alter database test set recovery simple


你的數據庫服務器-》企業管理器-》管理-》SQL Server 代理-》作業-》新建作業,按照要求填就可以了,在“步驟”的“命令”中填寫你要執行的存儲過程或語句,在“調度”里面填寫什么時間執行

每天用作業執行:
DUMP  TRANSACTION  庫名  WITH  NO_LOG
或:
backup log 數據庫 with no_log

#4


可以做一個JOB,找一個空余的時間去刪除日志文件。。

#5


定期清理。

#6


SQL Server的日志是一個可怕的家伙,會不停的增長,如果限制大小,又會出現問題!那么如何減少SQL Server日志的大小呢?用如下的命令即可: 
backup log DatabaseName with no_log

dbcc shrinkdatabase(DatabaseName)

或者接下來,用企業管理器收縮數據庫即可!

代碼如下:

with TADOQuery.Create(Self) do

try

Connection := FrmDm.dbKS;

///清除日志,並且收縮數據庫,減少物理文件大小

SQL.Add('backup log KS with no_log');

SQL.Add('dbcc shrinkdatabase(KS)');

ExecSQL;

finally

Free;

end;

---------------------------------------

nzfsoft

下面這段sql代碼是改自Microsoft的, 你運行一下生成的stored proc, 可以把你的log文件縮小到10M, ^_^

注意把里面注釋的數據庫名改成你自己的庫名啊

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

drop procedure [dbo].[Truncate_Log_File]

GO

SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON

GO

CREATE PROCEDURE [Truncate_Log_File] AS

SET NOCOUNT ON

DECLARE @LogicalFileName sysname,

@MaxMinutes INT,

@NewSize INT

SELECT @LogicalFileName = 'XXXX_LOG', -- 這里的XXXX_LOG替換成泥自己數據庫的log名

@MaxMinutes = 10,

@NewSize = 10

DECLARE @OriginalSize int

SELECT @OriginalSize = size

FROM sysfiles

WHERE name = @LogicalFileName

DECLARE @Counter INT,

@StartTime DATETIME,

@TruncLog VARCHAR(255)

WHILE @OriginalSize*8/1024>@Newsize

BEGIN

CREATE TABLE DummyTrans

(DummyColumn char (8000) not null)

SELECT @StartTime = GETDATE(),

@TruncLog = 'BACKUP LOG ['+ db_name() + '] WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)

EXEC (@TruncLog)

WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE())

AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)

AND (@OriginalSize * 8 /1024) > @NewSize

BEGIN

SELECT @Counter = 0

WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 5000))

BEGIN

INSERT DummyTrans valueS ('Fill Log')

DELETE DummyTrans

SELECT @Counter = @Counter + 1

END

EXEC (@TruncLog)

END

SELECT @OriginalSize=size

FROM sysfiles

WHERE name = @LogicalFileName

DROP TABLE DummyTrans

END

SET NOCOUNT OFF

GO

SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON

GO

#7


大力的已經夠完整了.

#8


sp_dboption 'trunc.log on chkpt.','TRUE'
縮短事務日志(刪去已提交的事務),每當檢查點過程發生時引發——在開發過程中用來保留事務日志空間。不要在生產數據庫中使用。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: