首先備份資料庫
然後備份檔案,備份記錄檔,可改名
在 查詢分析器裡執行 sp_attach_single_file_db,將產生新的記錄檔
具體怎麼做,我也沒做過,讓有經驗的人回答。,我去收集一下這方面的資料
從大洋網摘錄的方法,未試過
用 bcp命令把資料庫中的記錄都匯出來儲存到另一台機器,然後用truncate table tablename
的方式把所有記錄都清空,然後執行dump transaction dbname with no_log,發現log檔案已顯著減少,再用bcp命令匯入,匯入後log檔案又增大,但再用 dump transaction dbname with no_log,效果不僅是使日誌占的空間減少,記錄檔的size也顯著減少。
前幾天也碰到記錄檔過大的問題,資料庫實際大小為600M, 記錄檔實際大小為33M, 但記錄檔佔用空間為2.8G!!!
試了多種方式,SHIRNK DATABASE, TRUNCATE LOG FILE, 都沒辦法將檔案縮小。無論如何,這應該算SQL SERVER的一個BUG吧。
後來找到下面的代碼,就可以將記錄檔縮小到自己想要的大小了。把代碼COPY到查詢分析器裡,,然後修改其中的3個參數(資料庫名,記錄檔名,和目標記錄檔的大小),運行即可(我已經用過多次了)
-----
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE Marias -- 要操作的資料庫名
SELECT @LogicalFileName = 'Marias_log', -- 記錄檔名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 100 -- 你想設定的記錄檔的大小(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
理解日誌截斷選項
不同的備份日誌截斷選項經常被DBA新手所忽視。DBA新手通常並不知道選項存在或瞭解它們的作用。怎樣使用或什麼時候時候它們,以下的幾小節詳細解釋每個選項的作用以及在什麼時候使用它。
TRUNCATE_ONLY
TRUNCATE_ONLY選項截掉交易記錄的非活動部分,而不備份(拷貝)日誌到備份裝置上。因為日誌沒有拷貝,所以在使用TRUNCATE_ONLY時,不必指明備份裝置。例如,用TRUNCATE_ONLY選項備份主要資料庫交易記錄的文法如下:
Backup Log master
WITH TRUNCATE_ONLY
在以下情況下使用TRUNCATE_ONLY:
如果你不是為了恢複目的使用交易記錄,並且依賴於完整Database Backup(完整或差異)。如果沒有執行Database Backup就使用TRUNCATE_ONLY選項,你將不能在帶有TRUNCATE_ONLY的BACKUP LOG命令執行時,恢複交易記錄非活動部分的已完成事務。
NO_LOG
當有NO_LOG選項的BACKUP LOG命令執行時,SQL SERVER不記錄BACKUP LOG命令,就截斷交易記錄的非活動部分。
僅當交易記錄完全填滿時才使用NO_LOG選項,當日誌完全填滿時,你不能通過執行一條普通的BACKUP LOG命令來截斷交易記錄。這樣是因為SQL SERVER試圖記錄BACKUP命令,而在交易記錄中卻沒有剩餘空間。和TRUNCATE_ONLY選項一樣,NO_LOG選項不需要備份裝置,因為日誌並不拷貝到裝置上去。
NO_TRUNCATE
當你試圖進入的資料庫被破壞並打算恢複資料庫時,使用NO_TRUNCATE選項。要使用NO_TRUNCATE,必須滿足以下條件:
交易記錄必須和資料庫在不同的裝置上。
MASTER資料庫必須沒有被破壞
NO_TRUNCATE記錄從最近一次交易記錄備份,到資料庫破壞點的所有交易記錄項。然後恢複交易記錄備份作為最近一次備份,它在恢複過程中,可精確到毫秒級。
很多時候,我們被資料庫記錄檔大小不斷在增加而困撓,雖然可以用截短交易記錄的命令dump transaction database_name with no_log來使日誌佔用實際物理log檔案的空間的百分比減小,但資料庫log檔案的把磁碟的空間霸佔著不用,使其他的程式所需的空間受到影響。為此,我做了很多次實驗,以探討能夠直接減小log檔案大小的方法,請方家指教!
根據db_option中的有關選項,在不同設定時,做dump transaction database_name with no_log操作後,發現log檔案的total space都不變化,只是used space變小,而free space相應變大。這樣的變化意味著,你以後的日誌還有可寫入的空間,因為空白間被預留了。但當這個log檔案已經太大,而影響了其他程式的使用空間時,這樣的結果並不是我需要的。
後來我做了一個這樣的操作,用bcp命令把資料庫中的記錄都匯出來儲存到另一台機器的硬碟上。然後用truncate table table_name的方式把所有的記錄都清空,然後執行dump transaction database_name with no_log,發現log檔案已經顯著地減小,再用bcp命令將之前置出的資料匯入到資料庫中,匯入完成後,log檔案又增大了,但再用dump transaction database_name with no_log命令操作時,效果不僅是使日誌佔用空間減少,記錄檔的size也顯著地減小。
對於以上現象,請有興趣的同道予以驗證,至於這個操作對資料庫的物件和完整性是否有影響,還望高手指教!