SQL Server 事務日誌收縮小結

2021-05-18 08:32:11 字數 2173 閱讀 3465

對於每乙個資料庫來講,都需要至少乙個事務日誌檔案。事務日誌檔案是整個資料庫的血液,如果沒有事務日誌的話,那麼將無法進行任何操作。 

事務日誌記錄著在相關資料庫上的操作,同時還儲存資料庫恢復(recovery)的相關資訊。

事務日誌與資料庫恢復(recovery)是密切相關的,其實資料庫在啟動時,便會進行相關的恢復(recovery)操作,如下所示。當然,在資料庫還原時,也可以指定手工恢復(recovery).任何在資料庫上的改變,如果在事務日誌內被標記為已提交,並用乙個lsn(log sequence number)來標識,同時相關改變就會體現在資料檔案上,而被標記為未提交的改變將不會體現在資料檔案上。

2010-01-12 18:31:48.72 spid7s      recovery is complete. this is an informationa message only. no user action is required.

事務日誌檔案還儲存著資料庫需要回滾的相關資訊。在sql server資料庫上,預設是隱式提交的,也就是說在查詢分析器裡面進行的每乙個操作,在操作完成後,都是預設已經commit,但如果通過指定begin tran 和rollback tran的命令來標識事務時,rollback tran就需要使用事務日誌內的相關資訊才可以回滾。當然,如果sql server遇到相關錯誤時,如死鎖,那麼也會產生乙個內部回滾,這些都需要用到事務日誌檔案。

收縮日誌的原因有很多種,有些則是考慮空間不足,有些則是應用程式限制導致的,一般情況下,是不建議對事務日誌進行其他改變的,如需要控制事務日誌的大小,則可以通過安排事務日誌備份來解決。如果確定事務日誌包含將不再使用的未使用空間,則可以通過減少事務日誌的大小,以便**過多空間。但這種情況對於乙個dba來講,應該要盡量避免。

僅當資料庫處於聯機狀態,而且至少乙個虛擬日誌檔案可用時,收縮才會發生。在某些情況下,直到下乙個日誌截斷後,才能收縮日誌。

每個事務日誌由多個虛擬日誌檔案組成(virtual log file).虛擬日誌檔案沒有固定的大小,也沒有固定的個數。在建立事務日誌檔案或者擴充套件事務日誌檔案時,sql server便會自動建立合適大小的虛擬日誌檔案,dba無法控制虛擬日誌檔案的大小和個數。在擴充套件日誌檔案後,虛擬檔案的大小是現有日誌大小和新檔案增量大小之和。因此,如果在建立資料庫時,對資料庫指定了比較小的初始大小,又指定了比較小的日誌增長量,隨著事務日誌的自動擴充套件,虛擬日誌檔案個數會越來越多,從而影響了資料庫效能。因此,在建立資料庫時,盡量指定比較合適的初始事務日誌大小,同時指定合理的事務日誌增長量,這點可以參考資料檔案的標準。如果大於10g或者更大的話,則指定固定的增長量,如果比較小,則指定按百分比的增長量來進行。

以下部分引用文件:

對於日誌檔案,當前大小與虛擬日誌檔案使用的頁的總大小相同。不能釋放包含任何邏輯日誌部分的虛擬日誌檔案。如果日誌檔案中的所有虛擬日誌檔案都包含邏輯日誌部分,則此日誌檔案不能收縮。通過日誌截斷將乙個或多個虛擬日誌檔案標記為非活動之後,才能進行收縮。

收縮檔案操作只能刪除不活動的虛擬日誌檔案。如果未指定目標大小,收縮檔案操作僅刪除檔案中最後乙個活動虛擬日誌檔案後面的不活動虛擬日誌檔案。如果指定目標大小,則給定收縮檔案操作僅刪除足夠多的不活動虛擬日誌檔案,以接近但不超過目標大小。收縮之後,日誌檔案通常稍大於目標大小,但永遠不會小於目標大小。由於虛擬日誌檔案的存在,因此很難**日誌檔案的實際收縮程度。

在收縮任何檔案時,必須從檔案的末端開始釋放空間。在收縮事務日誌檔案時,將從日誌檔案的末端釋放足夠的虛擬日誌檔案,以便將日誌減小到使用者所要求的大小。使用者指定的 target_size 將圓整為下乙個最大的虛擬日誌檔案邊界。例如,如果使用者為包含六個 100 mb 虛擬日誌檔案的 600 mb 的示例檔案指定 325 mb 的 target_size,則最後兩個虛擬日誌檔案將刪除,新的檔案大小為 400 mb。

也就是說有時候雖然截斷了事務日誌,但有可能仍然無法將事務日誌收縮至自己預期的大小。

收縮日誌檔案,在不同版本上有著不同的方法,但本文只研究sql server2008的,其它版本暫不討論。

1、當資料庫恢復模式為簡單時。可以直接通過圖形介面或者使用dbcc shrinkfile (logfile_name,target_size)命令來完成。如

2、當資料庫恢復模式為完全時。可以先將資料庫模式改為簡單模式,再使用上述方法來進行。

也可以直接備份事務日誌檔案後再收縮:

3、通過分離資料庫,然後再刪除事務日誌檔案,再附加mdf資料檔案,也可以達到某種意義上的事務日誌收縮。

Sqlserver 日誌收縮

日誌收縮 日誌收縮 use master goalter database sd log set recovery with no wait goalter database sd log set recovery 簡單模式 gouse sd log godbcc shrinkfile 2 11,t...

Sql Server 2008 收縮日誌

收縮日誌 alter database dnname set recovery with no wait goalter database dnname set recovery 簡單模式 gouse dnname godbcc shrinkfile n dnname log 11,truncate...

SQL SERVER手動收縮日誌檔案

sql server資料庫日誌檔案增長過快,半年時間由9g增長到150g,不知道是不是日誌原因,伺服器占用記憶體一直很高,10 g。檢視日誌,多是某帳戶登入成功的資訊,這個資訊不知道能不能取消掉。有路過的大神請指教。先分享下手動收縮日誌檔案方法,比較安全的,還有分離 清除 附加,儲存過程清除日誌的方...