數據庫的恢復模型是否影響故障恢復,在簡單恢復模式裏,你是否會丟失事務?在今天的文章裏我想談下這點,詳細討論下。sql
對於這個問題的最簡單的答案是不會:恢復模型不會影響故障恢復,只用簡單恢復模式你不會丟失事務。那數據庫恢復模型的目的是什麼?數據庫
你用恢復模型你只告訴SQL Server如何處理事務日誌。SQL Server提供下列3個恢復模型:spa
咱們來細談下。每一個新建的數據庫默認是完整恢復模式(在完整數據庫備份後!)。完整恢復模式意味着你須要進行按期事務日誌備份。在事務日誌備份後,SQL Server能夠標記VLFs(虛擬日誌文件(Vitural Log Files))爲不活動,在下個檢查點能夠重寫它們。若是你不進行按期的事務日誌備份,SQL Server不能重寫VLFs(由於它們仍是活動的),這樣的話你的事務日誌會增加。日誌
增加事務日誌很慢(由於須要零值初始化(Zero Initialization))並致使日誌碎片(Log Fragmentation)(大量不一樣的VLFs)。按期日誌備份的另外一個好處是你能夠進行所謂的時間點恢復(Point in Time Recovery),即恢復你的數據庫到指定的時間點。blog
若是你不在意你的數據(我會被你們笑話的!),你能夠把你的數據庫恢復模式切換爲簡單。使用簡單恢復模式,你不須要麻煩本身進行平常事務日誌備份,由於在檢查點(CHECKPOINT)SQL Server會標記VLFs爲不活動。若是你沒有長時間運行的事務,在這個恢復模式裏,你的事務日誌不會增加。簡單恢復模式的一個反作用就是你不能進行時間點恢復(Point in Time Recovery)。 事務
當你的數據庫崩潰或損壞,你只能恢復你的數據庫到你最近的完整數據庫備份,外加可用的差別備份。在這個狀況下你丟失多少數據取決於你最近的完整/差別備份的狀況。對於OLTP數據庫,我從不推薦簡單恢復模式。在數據倉庫的情景下倒可使用,由於存儲的數據基本不會有啥改變。get
最後SQL Server還提供你大容量日誌恢復模式。在SQL Server裏,當你運行特定的操做,它們能夠是最小化日誌(Minimally Logged)(在SQL Server裏沒有無日誌操做!)。若是你用的是大容量日誌恢復模式。最小化日誌意味着SQL Server不會寫各個事務日誌記錄到事務日誌,當你進行這樣操做的時候。it
SQL Server只經過所謂的BCM頁(大容量修改映射頁(Bulk Changed Map Page))標記修改的區爲已修改。這樣的話,當你進行最小化日誌操做時,你的事務日誌不會變得那麼大。很差的反作用是在那期間(數據庫運行在大容量日誌恢復模式)你不能進行時間點恢復。所以在這個恢復模式下,你應該儘可能縮短它的時間。例如:當你在運行最小化日誌操做的時候,你才把數據庫從完整恢復模式切換回大容量日誌模式(運行完後切換回完整恢復模式)。io
當你運行在大容量日誌恢復模式裏,你仍是要進行事務日誌備份。但它們的大小不會變小,由於SQL Server複製修改的分區(基於BCM頁)到事務日誌備份——如你從下圖看到的同樣。model
故障恢復過程毫不會受恢復模式影響。恢復模式志影響你的事務日誌,還有你是否能進行時間點恢復。一般建議你應該使用默認的完整恢復模式加按期事務日誌備份。由於用這個方法你能夠最小化你的數據丟失。
感謝關注!
https://www.sqlpassion.at/archive/2016/05/23/crash-recovery-recovery-models