切換到簡單恢復 - 縮小事務日誌
標準免責聲明:我是一名“非自願 DBA”(我在本文中看到的一個很好的片語)並且已經閱讀了很多很多很多很多關於這個主題的內容,但仍然感到困惑/擔心……
我需要將幾個 SQL Server 2014 生產數據庫的恢復模式從 Full 更改為 Simple。
數據庫目前設置為完全恢復,並正在使用SqlBackupAndFTP進行備份,該備份每天進行一次完全備份,每天進行 3 次差異備份和 20 次事務備份。在我們與提供基於 FTP 的儲存的公司遇到巨大問題之前,這一直很好。
大約 3 個月前,我轉而使用執行良好的Attix5 - 但是,我現在發現由於軟體的工作方式,事務日誌與數據文件一樣大(在一種情況下,超過 14Gb 對 13Gb 數據文件)。
有人建議我將恢復模式切換為簡單,這樣事務日誌就不會增長。
我知道簡單恢復不會提供時間點恢復——這絕對沒問題,因為每小時都會進行一次完整備份,我們“很高興失去”之前 1-59 分鐘內可能發生的任何事情。
我的理解是我應該將恢復模式設置為簡單並讓備份發生,這將在事務日誌中設置一個檢查點,以便重新使用空間。
但是,我確實需要將事務日誌縮小到合理的大小(這樣它就不會佔用太多的備份空間),但我一直認為縮小是一個壞主意。還是我弄錯了?
如果我使用以下命令將事務日誌縮小到大約 25Mb(對於每小時一組事務來說應該足夠大),這是否足夠?
DBCC SHRINKFILE('log file name',25)
(我真的很抱歉要問一些以前似乎被問過無數次的問題,但這不是我能弄錯的問題。)
首先,我想再次指出,在大多數情況下,不建議將 SIMPLE 恢復用於生產數據庫。但是,如果您希望更改我發現的縮小 LOG 文件的最佳方法,則在將數據庫置於 SIMPLE 恢復模式後,如下所示。這不僅會從日誌中釋放可用空間,還會將文件縮小到可能的最小大小。
正如您所說,縮小通常也不是一個好習慣,但有時它是必要的。有很多關於它的讚成/反對文章,我同意那些會告訴你永遠不要使用
DBCC SHRINKDATABASE;
always useDBCC SHRINKFILE
如果你絕對必須做收縮的文章。但是,日誌文件確實必須具有合理的大小,即使在簡單恢復模型中也是如此,因為這是在事務期間保存資訊的地方,並且長時間執行的 SPID 需要更多的日誌文件。在許多原因中,其中之一是在出現問題時進行回滾。正如我上面所說,這些腳本會將您的日誌文件減少到可能的絕對最小大小,但是因為您至少需要一些日誌空間,您應該通過手動重新增長它來跟進,並確保您的“自動增長”設置為合理的數字; 可以說,總是要避免一個百分比。將日誌縮小到最小大小並手動重新增長它完成了一個非常重要的過程 - 保持 VLF 碎片/倒計時。這是另一個我不會在這裡討論的話題,包括 Brent Ozar 在內的許多網站都可以進行實際統計和測試以說明原因,但如果需要更大或更大的日誌文件,每次增長總是將日誌文件增加 8 GB。您在上面提到了 25 MB,我無法想像它足夠大。我個人目前管理著一百多個數據庫,只有不到十幾個設置為 64 MB - 所有其他數據庫都大得多,最高可達 64 GB。您的實際 SQL 活動和查詢將確定您的最佳大小。至少我會從 512 MB 增加到 2 GB 並將你的增長設置為相同,直到你知道你的日誌文件應該放在什麼位置。我個人目前管理著一百多個數據庫,只有不到十幾個設置為 64 MB - 所有其他數據庫都大得多,最高可達 64 GB。您的實際 SQL 活動和查詢將確定您的最佳大小。至少我會從 512 MB 增加到 2 GB 並將你的增長設置為相同,直到你知道你的日誌文件應該放在什麼位置。我個人目前管理著一百多個數據庫,只有不到十幾個設置為 64 MB - 所有其他數據庫都大得多,最高可達 64 GB。您的實際 SQL 活動和查詢將確定您的最佳大小。至少我會從 512 MB 增加到 2 GB 並將你的增長設置為相同,直到你知道你的日誌文件應該放在什麼位置。
我發現單獨執行每條線效果最好,確保在進行下一步之前成功。最後一行當然是將您的日誌重新增長到您設置的大小。我有 8 GB,但您可以根據需要進行更改。如果您此時不想完全收縮然後重新生長,請刪除最後一行並將上一行中的“1”更改為您選擇的尺寸。
在你出去縮小你的日誌文件之前的最後一件事。
重要提示: 任何時候日誌文件增長,手動或通過 SQL 自動增長,基本上你的整個數據庫都會被鎖定,直到增長完成。選擇一個不會影響活動交易的好時機 - 如果您有“下班後”或維護視窗。如此小的 1 GB 或更少的大小對於最終使用者來說應該是相當快且不可見的,但這將真正取決於您的基礎架構。
USE [DatabaseName] DBCC SHRINKFILE (N'LogicalName', 0, TRUNCATEONLY) DBCC SHRINKFILE (N'LogicalName', 1) ALTER DATABASE [DatabaseName] MODIFY FILE ( NAME = N'LogicalName', SIZE = 8192 MB )