1

我有一個23億行和76GB大小的大型數據庫。限制SQL Server日誌文件增長率

我的問題是,我想將列類型轉換爲smalldatetime,但在此操作過程中,.ldf文件增長得如此之大,以至於它佔用了我的整個磁盤空間(它達到350gb),然後查詢退出時出現錯誤。

有什麼辦法讓.ldf變小嗎?

我從選項中縮小了我的.ldf。

數據庫恢復模式設置爲簡單。

+0

莫非[這](HTTP://dba.stackexchange。 com/questions/31838/how-to-disable-ldf-file-or-limit-its-size)對你有幫助嗎? (點2,將自動收縮設爲真) –

+1

@Ricardo不,請不要打開自動收縮! –

+2

不要啓用自動收縮;這會對你的數據庫造成嚴重破壞。此外,它不會影響LDF文件,因爲它是一個增長的單個事務。 –

回答

3

添加smalldatetime類型的新的可空列。然後慢慢地(即,例如,批量10-100k行)通過基於舊列值設置其值而填充該列。一旦所有行在新列中都有值,請刪除舊列,並將新列重命名爲舊列名。

這將確保沒有交易變得足夠大,嚴重影響您的日誌文件。

0

這裏是最終代碼: 我運行它,所以我現在就會知道,如果它的100%好明天,但它似乎工作

WHILE (2 > 1) 
    BEGIN 
    BEGIN TRANSACTION 
    UPDATE TOP (10000) [ais].[dbo].[imis position report] 
    SET [time2] = convert(smalldatetime, left(date, 19)) 
    IF @@ROWCOUNT = 0 
     BEGIN 
     COMMIT TRANSACTION 
     BREAK 
     END 
    COMMIT TRANSACTION 
    -- 1 second delay 
    WAITFOR DELAY '00:00:01' 
    END -- WHILE 
GO 
+0

上面的代碼不起作用:(它仍填充日誌文件並丟失錯誤 –

+0

腳本運行時sys.databases中的log_reuse_wait_desc值是什麼?(請在幾分鐘後檢查)嘗試在後面插入'CHECKPOINT'每個'COMMIT'。 – usr

+0

你能提供一些代碼嗎? –