在 SQL Server 實例中的每一個數據庫,都有一個日志,它記錄著數據庫的所有更改。由于這個日志是獨立的,在更改發(fā)生之前,事務日志允許在硬件故障或應用程序錯誤時,對數據庫回滾或保存事務。由于它的角色的重要性,事務日志被保存在一個或多個與數據庫文件獨立的日志文件中;日志記錄是在內容的變更從緩存寫到數據庫文件中以前發(fā)生的。
對每個數據庫,事務日志支持以下操作: 當發(fā)出一個回滾操作或數據庫引擎檢測到一個錯時,進行事務回滾; 當服務器失改時,進行一個完整的事務回滾。這個事務在SQL Server 重啟時進行回滾。 當服務器失敗時,將未完成的事務寫入到日志文件,而不是數據文件中。當 SQL Server 重啟時,這些未完成的事務將會寫入數據文件。 當發(fā)生硬件錯誤時,對恢復的數據庫、文件組、文件或頁向前滾動到失敗點。事務將滾動到最后一個完整備份或差異備點。 對事務復制、數據庫鏡像、日志傳輸提供支持。
每個 SQL Server 數據庫都有一個恢復模式屬性,(the Recovery Model), 它指示事務日志如何記錄,如:事務日志是否可以被備份,以及恢復操作的許可類型。默認情況下,一個新的數據庫從 Model 數據庫繼承了一個恢復模式 。當然,你也可以修改默認設置為其它模式。
你可以配置一個 SQL Server 數據庫的恢復模式為以下幾種之一: 簡單模式(Simple): 在這種模式下,事務日志的備份是不安全的,這意味著你不能對備份之后的事務日志進行管理。這種模式也會自動的擴展日志空間,所以幾乎不需要去管理事務日志的空間。然而,這種模式也是風險最大的一種模式,數據庫只能被恢復到最后一次備份的時間點,而在最后一次備份之后執(zhí)行的事務將會丟失。這種模式通常用于系統數據庫、或者用于測試和開發(fā)階段。或者是幾乎僅有只讀情況的數據倉庫數據庫。這種情況下,一些操作只是盡可能少的被記錄。 完整模式(Full): 由于這種模式可以提示指定時間點的恢復,因此它可以備份并且也應當進行備份。這種模式比簡單模式的風險要小。但是,在完整模式下,所有的操作都被完整的記錄,包括大數據量操作。這種模式適用于生產環(huán)境。 大數據量記錄模式(Bulk Logged): 這種模式可以看作是完整模式的補充,因為在這種模式下,大數量操作只是被最小化的記錄。例如,你可能要大量的加載數據但你不希望這些事務日志被記錄,因為你只是希望加載數據而已。在這種情況下,你可以在導入數據時,將模式由完整模式切換到大數據量模式,執(zhí)行完后,再恢復到完整模式。(需要注意的是:在切換回完整模式后,你應當做一次完整備份) 你可以在數據庫上通過執(zhí)行 ALTER DATABASE 語句,和指定 Set Recovery 來切換這些模式,例子如下:
USE master;
ALTER DATABASE EmployeeDB SET RECOVERY FULL;
在上面的代碼中,我修改了 EmployeeDB 數據庫,并將恢復模式設置為完整模式 FULL。注意:由于默認的 model 數據庫是被配置為完整模式 Full ,這也意味著 EmployeeDB 數據庫被自動配置為完整模式,因為它是繼承自 model 數據庫的。 所以,如果在你的服務器上, model 數據庫的默認設置沒有被更改的話,上面的的例子中 ALTER DATABASE 并不會改變什么,但是你要注意,當你將數據從 簡單模式 切換到完整模式時,有時候必須執(zhí)行一些其它步驟,例如進行一個完整備份。在SQL Server 在線教程中主題 "Considerations for Switching from the Simple Recovery Model" 描述了將數據庫的恢復模式從簡單模式轉換為完整模式或大容量模式時,有哪些步驟要執(zhí)行。 你也可以在 SQL Server Management Studio中設置恢復模式。在對象瀏覽器中右鍵單擊數據庫名稱,并選擇“屬性”,在數據庫屬性對話框中,單擊選項頁,并設置恢復模式屬性。
SELECT name, size, -- in 8-KB pages max_size, -- in 8-KB pages growth, is_percent_growth FROM sys.database_files WHERE type_desc = 'LOG' 這條語句返回了當前的文件大小(按8-KB的頁面大小),文件可增長到的最大大小 (同樣按 8_KB 的頁面大小),增長率和是否按百分比增長標記。該標記指示數據庫文件的大小按何種方式增長。如果標記被設置為0,那么增長率就是 8-KB ,如果設置為 1,則按百分比增長。 上述代碼返回的結果大致如下: Name size max_size growth is_percent_growth EmployeeDB_log 128 268435456 10 1 如結果中所示,這條語句只返回一行記錄。這是因為 EmployeeDB 只配置了一個日志文件。上面的結果還反映了 EmployeeDB_log 的當前文件大小是 128 個8-KB 的頁面大小,它可以增長到 268,435,456 個8-KB 的頁面大小,增長率是按 10%的速率。 你還可以使用 DBCC SQLPERF 語句返回一個 SQL Server 實例的每個數據庫的事務日志信息,要獲取日志數據,你必須在參數中使用 LOGSPACE 關鍵字,如下所示: DBCC SQLPERF(LOGSPACE); 這條語句返回以 MB 計算的日志大小,日志空間使用的百分比,以及你的 SQL Server 實例中每個數據庫的日志狀態(tài)。 EmployeeDB 數據庫的信息如下: Database Name Log Size (MB) Log Space Used (%) Status EmployeeDB 0.9921875 40.05906 0 這個例子中 EmployeeDB 日志大約是 1 MB 大小,并且使用了 40% 的日志空間。 你也可以在 SQL Server Management Studio 中生成一個圖形化的報表,結果類似于執(zhí)行 DBCC SQLPERF 語句。方法是:在對象瀏覽器中,右鍵單擊數據庫名稱,選擇報表,再選擇標準報表,最后點擊磁盤利用率。
備份日志文件 如果你將數據庫的恢復模式配置為完全模式或大容量模式,你就應當有規(guī)律的備份事務日志,這樣你就可以截斷日志并釋放不活動的日志空間。備份也可以用于恢復數據庫(通常與數據庫備份一起使用)。 在事務日志備份之前,必須先執(zhí)行過一個數據庫的完整備份。通常,在我使用本文中的日志備份前,一般都先執(zhí)行下面的數據庫備份語句: BACKUP DATABASE EmployeeDB TO DISK = 'E:/DbBackup/EmployeeDB_dat.bak'; 注意:執(zhí)行這段代碼時,確認指定路徑存在或指定一個另外的路徑。 執(zhí)行完數據庫備份后,我一般運行下面的數據修改語句,以使當前日志不包含已備份的內容:
USE EmployeeDB;
UPDATE Employees SET JobTitle = 'To be determined';
UPDATE Employees SET CountryRegionName = 'US' WHERE CountryRegionName = 'United States';
DELETE Employees WHERE BusinessEntityID > 5; 然后我再運行 DBCC SQLPERF 查看日志空間的統計信息,該語句返回下面的結果: Database Name Log Size (MB) Log Space Used (%) Status EmployeeDB 0.9921875 64.41929 0 你可以看到,日志空間的使用率已從40%提升到接近65%。 備份完數據庫,你就可以備份事務日志了。執(zhí)行事務日志的備份,使用 BACKUP LOG 語句,并指定備份位置,如下: -- back up transaction log BACKUP LOG EmployeeDB TO DISK = 'E:/LogBackup/EmployeeDB_log.bak'; 同樣要注意路徑的問題。 這里我指定了備份路徑,然而, BACKUP 還支持其它選項,可以在SQL Server Books Online查看 “BACKUP (Transact-SQL)” 主題以獲得更多信息。 執(zhí)行完事務日志的備份以后, SQL Server 數據庫引擎會自動截斷不活動的日志空間。(注意:截斷事務日志只是移除了不活動的虛擬日志空間,并不減小文件大小)要減小日志文件,你應當對文件進行收縮。要檢查是否截斷了日志,請再次運行 DBCC SQLPERF 語句。現在的結果應當如下面所示: Database Name Log Size (MB) Log Space Used (%) Status EmployeeDB 0.9921875 44.88189 0 現在日志空間已下降到45%。
總結 很明顯,事務日志在 SQL Server 數據庫中扮演著非常重要的角色,上面的內容指導您如何用它們來工作。 上面關于事務日志,我沒講到的東西有:如何支持事務日志的復制、數據庫的鏡像和事務日志的發(fā)布,也沒有講到如何使用事務日志進行數據庫的恢復。這些內容每個都是一個專題,但至少你現在對事務日志有了一個基本的認識,這是基礎。不過,我還是強烈建議您認真閱讀 SQL Server 在線幫助上關于事務日志的不同主題和其它資源,這樣你就會對如何使用日志來工作,并最好的把握它。