天天看點

SQL Server日志檔案總結

交易日志(Transaction logs)是資料庫結構中非常重要但又經常被忽略的部分。由于它并不像資料庫中的schema那樣活躍,是以很少有人關注交易日志。

交易日志是針對資料庫改變所做的記錄,它可以記錄針對資料庫的任何操作,并将記錄結果儲存在獨立的檔案中。對于任何每一個交易過程,交易日志都有非常全面的記錄,根據這些記錄可以将資料檔案恢複成交易前的狀态。從交易動作開始,交易日志就處于記錄狀态,交易過程中對資料庫的任何操作都在記錄範圍,直到使用者點選送出或後退後才結束記錄。每個資料庫都擁有至少一個交易日志以及一個資料檔案。

出于性能上的考慮,SQL Server将使用者的改動存入緩存中,這些改變會立即寫入交易日志,但不會立即寫入資料檔案。交易日志會通過一個标記點來确定某個交易是否已将緩存中的資料寫入資料檔案。當SQL Server重新開機後,它會檢視日志中最新的标記點,并将這個标記點後面的交易記錄抹去,因為這些交易記錄并沒有真正的将緩存中的資料寫入資料檔案。這可以防止那些中斷的交易修改資料檔案。

維護交易日志

因為很多人經常遺忘交易日志,是以它也會給系統帶來一些問題。随着系統的不斷運作,日志記錄的内容會越來越多,日志檔案的體積也會越來越大,最終導緻可用磁盤空間不足。除非日常工作中經常對日志進行清理,否則日志檔案最終會侵占分區内的全部可用空間。日志的預設配置為不限容量,如果以這種配置工作,它就會不斷膨脹,最終也會占據全部可用空間。這兩種情況都會導緻資料庫停止工作。

對交易日志的日常備份工作可以有效的防止日志檔案過分消耗磁盤空間。備份過程會将日志中不再需要的部分截除。截除的方法是首先把舊記錄标記為非活動狀态,然後将新日志覆寫到舊日志的位置上,這樣就可以防止交易日志的體積不斷膨脹。如果無法對日志進行經常性的備份工作,最好将資料庫設定為"簡單恢複模式"。在這種模式下,系統會強制交易日志在每次記錄标記點時,自動進行截除操作,以新日志覆寫舊日志。

截除過程發生在備份或将舊标記點标為非活動狀态時,它使得舊的交易記錄可以被覆寫,但這并不會減少交易日志實際占用的磁盤空間。就算不再使用日志,它依然會占據一定的空間。是以在維護時,還需要對交易日志進行壓縮。壓縮交易日志的方法是删除非活動記錄,進而減少日志檔案所占用的實體硬碟空間。

通過使用DBCC SHRINKDATABASE語句可以壓縮目前資料庫的交易日志檔案,DBCC SHRINKFILE語句用來壓縮指定的交易日志檔案,另外也可以在資料庫中激活自動壓縮操作。當壓縮日志時,首先會将舊記錄标記為非活動狀态,然後将帶有非活動标記的記錄徹底删除。根據所使用的壓縮方式的不同,你可能不會立即看到結果。在理想情況下,壓縮工作應該選在系統不是非常繁忙的時段進行,否則有可能影響資料庫性能。