資料庫的恢復模型是否影響故障恢復,在簡單恢復模式里,你是否會丟失事務?在今天的文章里我想談下這點,詳細討論下。 恢復模式(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