段落還原保持進行檢查,以便確保數據庫在結束時將是一致的。 在還原順序結束後,如果恢復的文件有效並且與數據庫一致,則恢復的文件將直接變為聯機狀態。
段落還原適用於所有恢復模式,但在完整恢復模式和大容量日志恢復模式下比在簡單恢復模式下更靈活。
所有的段落還原都從稱為“部分還原順序”的初始還原順序開始。 部分還原順序至少還原和恢復主文件組,在簡單恢復模式下還會還原和恢復所有讀/寫文件組。 在段落還原順序中,整個數據庫都必須脫機。 隨後,數據庫將處於聯機狀態,並且還原的文件組都處於可用狀態。 但是,所有未還原的文件組都將保持脫機狀態,無法訪問。 不過,對於任何脫機文件組,都可以在以後通過文件還原進行還原並進入聯機狀態。
無論數據庫采用何種恢復模式,部分還原順序都從 RESTORE DATABASE 語句開始,該語句將還原完整備份並指定 PARTIAL 選項。 PARTIAL 選項總是會啟動一個新的段落還原;因此,在部分還原順序的初始語句中,只能指定 PARTIAL 一次。 當部分還原順序完成並且數據庫聯機後,由於余下文件的恢復被推遲,這些文件的狀態將變為“恢復已掛起”。
此後,段落還原通常包括一個或多個還原順序,這些還原順序稱為“文件組還原順序”。 您可以等待執行特定的文件組還原順序,等待的時間長短由您決定。 每個文件組還原順序將一個或多個脫機文件組還原並恢復到與數據庫一致的點。 文件組還原順序的時間安排和數量取決於您的恢復目標、您想要還原的脫機文件組數量以及每個文件組還原順序中還原的脫機文件組的數量。
執行段落還原的精確要求取決於數據庫的恢復模式。
下面我們來看看實例:
--段落還原:數據庫損壞范圍比較大,跨多個數據文件甚至跨文件組的時候,我們不得不恢復整個數據庫。 --這時如果數據庫特別大,數據庫恢復時間將會很長。但我們可以使用SQL Server提供的段落還原,來逐步恢復數據庫。 --首先備份尾日志: BACKUP LOG [AdventureWorks] TO DISK =N'D:\BACKUP_TEST\LOG_BACK_TAIL.trn' WITH NO_TRUNCATE ,NORECOVERY,COMPRESSION,STATS=10 --部分還原主文件組PRIMARY: RESTORE DATABASE [AdventureWorks] FILEGROUP=N'PRIMARY' FROM DISK=N'D:\BACKUP_TEST\AD_FULL.bak' WITH PARTIAL,NORECOVERY,STATS=10 --還原副文件組MST: RESTORE DATABASE [AdventureWorks] FILEGROUP=N'MST' FROM DISK=N'D:\BACKUP_TEST\AD_FULL.bak' WITH NORECOVERY,STATS=10 --依次還原日志: RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_1.TRN' WITH NORECOVERY,STATS=10 RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_2.TRN' WITH NORECOVERY,STATS=10 --還原尾日志並恢復 RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_TAIL.TRN' WITH RECOVERY,STATS=10 --此時AdventureWorks數據庫中位於PRIMARY和MST文件組中的文件已經可以訪問。 --但是位於其他文件組如:TRN文件組中的表還不能訪問。 --消息 8653,級別 16,狀態 1,第 2 行 --查詢處理器無法為表或視圖“****”生成計劃,因為該表駐留在不處於聯機狀態的文件組中。 --接下來還原副文件組TRN: RESTORE DATABASE [AdventureWorks] FILEGROUP=N'TRN' FROM DISK=N'D:\BACKUP_TEST\AD_FULL.bak' WITH NORECOVERY,STATS=10 --如果數據庫不是企業版,以上還原將會提示“尚未備份數據庫 "AdventureWorks" 的日志尾部。” --需要再次備份一次日志尾部,意味著還原副文件組TRN的時候整個數據庫都處於正在還原狀態。所以對於非企業版而言,只能離線段落還原,個人覺得意義不是很大...... --依次還原日志: RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_1.TRN' WITH NORECOVERY,STATS=10 RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_2.TRN' WITH NORECOVERY,STATS=10 --還原尾日志並恢復 RESTORE LOG [AdventureWorks] FROM DISK=N'D:\BACKUP_TEST\LOG_BACK_TAIL.TRN' WITH RECOVERY,STATS=10 --此時位於副文件組TRN中的表已經可以訪問了。 --段落還原全部完成
比如把一個名叫 MyDatabase 的數據庫 備份到 D盤根目錄,然後還原, 語句為:
backup database MyDatabase to disk='D:\MyDatabase.bak' --備份
restore database MyDatabase from disk='D:\MyDatabase.bak' --還原
備份日志 語句為:
backup log MyDatabase to disk = 'D:\MyDatabase_log.bak' --備份日志
SQL Server Management Studio裡面可以通過設置斷點
也可以用
raiserror或者noexec語句
raiserror例子
set noexec off
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
結果
消息 2745,級別 16,狀態 2,第 1 行
進程 ID 52 引發了用戶錯誤 50000,嚴重性 20。SQL Server 正在終止此進程。
消息 2745,級別 16,狀態 2,第 1 行
進程 ID 52 引發了用戶錯誤 50000,嚴重性 20。SQL Server 正在終止此進程。
消息 50000,級別 20,狀態 1,第 1 行
Oh no a fatal error
消息 0,級別 20,狀態 0,第 0 行
當前命令發生了嚴重錯誤。應放棄任何可能產生的結果。
noexec例子
set noexec off
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
go
print 'ho'
go
結果
hi
Fatal error, script will not continue!