故障恢復和恢復模式(Crash Recovery & Recovery Models)


數據庫的恢復模型是否影響故障恢復,在簡單恢復模式里,你是否會丟失事務?在今天的文章里我想談下這點,詳細討論下。

恢復模式(Recovery Models)

對於這個問題的最簡單的答案是不會:恢復模型不會影響故障恢復,只用簡單恢復模式你不會丟失事務。那數據庫恢復模型的目的是什么?

你用恢復模型你只告訴SQL Server如何處理事務日志。SQL Server提供下列3個恢復模型:

  • 完整(FULL)
  • 簡單(SIMPLE)
  • 大容量日志(BULK_LOGGED)

我們來細談下。每個新建的數據庫默認是完整恢復模式(在完整數據庫備份后!)。完整恢復模式意味着你需要進行定期事務日志備份。在事務日志備份后,SQL Server可以標記VLFs(虛擬日志文件(Vitural Log Files))為不活動,在下個檢查點可以重寫它們。如果你不進行定期的事務日志備份,SQL Server不能重寫VLFs(因為它們還是活動的),這樣的話你的事務日志會增長。

增長事務日志很慢(因為需要零值初始化(Zero Initialization))並導致日志碎片(Log Fragmentation)(大量不同的VLFs)。定期日志備份的另一個好處是你可以進行所謂的時間點恢復(Point in Time Recovery),即恢復你的數據庫到指定的時間點。

如果你不在乎你的數據(我會被大家笑話的!),你可以把你的數據庫恢復模式切換為簡單。使用簡單恢復模式,你不需要麻煩自己進行日常事務日志備份,因為在檢查點(CHECKPOINT)SQL Server會標記VLFs為不活動。如果你沒有長時間運行的事務,在這個恢復模式里,你的事務日志不會增長。簡單恢復模式的一個副作用就是你不能進行時間點恢復(Point in Time Recovery)

當你的數據庫崩潰或損壞,你只能恢復你的數據庫到你最近的完整數據庫備份,外加可用的差異備份。在這個情況下你丟失多少數據取決於你最近的完整/差異備份的情況。對於OLTP數據庫,我從不推薦簡單恢復模式。在數據倉庫的情景下倒可以使用,因為存儲的數據基本不會有啥改變。

最后SQL Server還提供你大容量日志恢復模式。在SQL Server里,當你運行特定的操作,它們可以是最小化日志(Minimally Logged(在SQL Server里沒有無日志操作!)。如果你用的是大容量日志恢復模式。最小化日志意味着SQL Server不會寫各個事務日志記錄到事務日志,當你進行這樣操作的時候。

SQL Server只通過所謂的BCM頁(大容量修改映射頁(Bulk Changed Map Page))標記修改的區為已修改。這樣的話,當你進行最小化日志操作時,你的事務日志不會變得那么大。不好的副作用是在那期間(數據庫運行在大容量日志恢復模式)你不能進行時間點恢復。因此在這個恢復模式下,你應該盡量縮短它的時間。例如:當你在運行最小化日志操作的時候,你才把數據庫從完整恢復模式切換回大容量日志模式(運行完后切換回完整恢復模式)。

當你運行在大容量日志恢復模式里,你還是要進行事務日志備份。但它們的大小不會變小,因為SQL Server復制修改的分區(基於BCM頁)到事務日志備份——如你從下圖看到的一樣。

小結

故障恢復過程絕不會受恢復模式影響。恢復模式志影響你的事務日志,還有你是否能進行時間點恢復。通常建議你應該使用默認的完整恢復模式加定期事務日志備份。因為用這個方法你可以最小化你的數據丟失。

感謝關注!

原文鏈接:

https://www.sqlpassion.at/archive/2016/05/23/crash-recovery-recovery-models


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM