其實有比較簡短的語法 就是 SQL 內定的 SP laughing 寶寶知道 但是寶寶先不說

又臭又長的 只要把有中文說明的部份改成你要的對象

P.S. 完整內容及持續更新版本請連結至原文查看:http://www.imp.idv.tw/play/forum/viewthread?thread=990

SET NOCOUNT ON 
DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT 

USE {DBName ex HRMS} -- 要操作的資料庫名 
SELECT 
  @LogicalFileName = '{Log file name ex HRMS_Log}', -- 日誌文件名 
  @MaxMinutes = 10, -- Limit on time allowed to wrap log. (M)
  @NewSize = 1 -- 你想設定的日誌文件的大小(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

引用自:藍色小惡魔MS SQL 清除 LOG 並縮減空間的語法
http://www.imp.idv.tw/play/forum/viewthread?thread=990

事隔這麼久... 我現在來公佈那個簡短的語法 但是請注意這個語法的缺點!!!

DUMP TRANSACTION DBName WITH NO_LOG

為什麼我不一開始就推薦這個語法勒...

因為這個內建的方法他不會重新設定 LOG 檔的初始大小

請注意我原本的語法中 〝@NewSize = 1 -- 你想設定的日誌文件的大小(M)

很多時候我們剛接手別人的系統,發現磁碟空間老是爆滿,第一手段就是控制 LOG 的成長。

然而如果你只會這個簡單的語法,如果不是很了解原理也許一開始你會猛按卻沒有效果,因為很多偷懶或不懂的資料庫設計者,就是愛把 LOG 開個幾百幾千妹的,很討厭......

但是去問他會不會解 LOG 抓賊啊?只有無言的答案!

而上面提到的簡短語法他只會把 LOG 清除,然後呢?該DB 的 LOG 檔就會強佔他被設定的初始空間。

舉例你會看到一個 LOG 檔有 2 G,其實他幾百年都是 2 G,你以為他用到 2 G 了所以用力清卻沒用。

使用了我樂樂長的可重設初始空間的語法後,你才發現該資料庫這輩子根本用不到 200 M。

廢話好多... 就是要告訴各位一件事情,萬事都別偷懶,最難的和最簡單的都要學,交叉使用才能讓你的系統設計達到藝術的完美境界! laughing

引用自:藍色小惡魔MS SQL 清除 LOG 並縮減空間的語法
http://www.imp.idv.tw/play/forum/viewthread?thread=990



    藍色小惡魔 發表在 痞客邦 留言(0) 人氣()