0.參考文獻
1.恢復模式
SQL Server 備份和還原操作發生在數據庫的恢復模式的上下文中。 恢復模式旨在控制事務日志維護。 “恢復模式”是一種數據庫屬性,它控制如何記錄事務,事務日志是否需要(以及允許)備份,以及可以使用哪些類型的還原操作。 有三種恢復模式:簡單恢復模式、完整恢復模式和大容量日志恢復模式。通常,數據庫使用完整恢復模式或簡單恢復模式。可以在執行大容量操作之前切換到大容量日志恢復模式,以補充完整恢復模式。數據庫可以隨時切換為其他恢復模式。
1.1恢復模式概述
下表概述了這三種恢復模式。
恢復模式 |
說明 |
工作丟失的風險 |
能否恢復到時點? |
||
---|---|---|---|---|---|
簡單(SIMPLE) |
無日志備份。 自動回收日志空間以減少空間需求,實際上不再需要管理事務日志空間。 有關簡單恢復模式下數據庫備份的信息,請參閱完整數據庫備份 (SQL Server)。 |
最新備份之后的更改不受保護。 在發生災難時,這些更改必須重做。 |
只能恢復到備份的結尾。 有關詳細信息,請參閱完整數據庫還原(簡單恢復模式)。 |
||
完全(FULL) |
需要日志備份。 數據文件丟失或損壞不會導致丟失工作。 可以恢復到任意時點(例如應用程序或用戶錯誤之前)。 有關完整恢復模式下數據庫備份的信息,請參閱完整數據庫備份 (SQL Server)和完整數據庫還原(完整恢復模式)。 |
正常情況下沒有。 如果日志尾部損壞,則必須重做自最新日志備份之后所做的更改。 |
如果備份在接近特定的時點完成,則可以恢復到該時點。 有關使用日志備份還原到故障點的信息,請參閱將 SQL Server 數據庫還原到某個時點(完整恢復模式).
|
||
大容量日志(BULK_INSERT) |
需要日志備份。 是完整恢復模式的附加模式,允許執行高性能的大容量復制操作。 通過使用最小方式記錄大多數大容量操作,減少日志空間使用量。 有關盡量減少日志量的操作的信息,請參閱事務日志 (SQL Server)。 有關大容量日志恢復模式下數據庫備份的信息,請參閱完整數據庫備份 (SQL Server) 和完整數據庫還原(完整恢復模式)。 |
如果在最新日志備份后發生日志損壞或執行大容量日志記錄操作,則必須重做自該上次備份之后所做的更改。 否則不丟失任何工作。 |
可以恢復到任何備份的結尾。 不支持時點恢復。 |
查看或更改數據庫的恢復模式
- 連接到相應的 Microsoft SQL Server 數據庫引擎 實例之后,在對象資源管理器中,單擊服務器名稱以展開服務器樹。
- 展開“數據庫”,然后根據數據庫的不同,選擇用戶數據庫,或展開“系統數據庫”,再選擇系統數據庫。
- 右鍵單擊該數據庫,再單擊“屬性”,這將打開“數據庫屬性”對話框。
- 在“選擇頁”窗格中,單擊“選項”。
- 當前恢復模式顯示在“恢復模式”列表框中。
- 也可以從列表中選擇不同的模式來更改恢復模式。可以選擇“完整”、“大容量日志”或“簡單”。如下圖所示:
-
1.3.使用TSQL更改數據庫恢復模式
--更改數據庫恢復模式 alter database AdventureWorks2012 set recovery {FULL|SIMPLE|BULK_LOGGED} --簡單恢復模式 alter database AdventureWorks2012 set recovery SIMPLE --完整恢復模式 alter database AdventureWorks2012 set recovery BULK_LOGGED --大容量日志恢復模式 alter database AdventureWorks2012 set recovery FULL
1.4.估計完整數據庫備份的大小
在實現備份與還原策略之前,應當估計完整數據庫備份將使用的磁盤空間。 備份操作會將數據庫中的數據復制到備份文件。 備份僅包含數據庫中的實際數據,而不包含任何未使用的空間。 因此,備份通常小於數據庫本身。(這也是為什么完整數據庫備份比文件備份更加節省空間的原因。) 您可以使用 sp_spaceused系統存儲過程估計完整數據庫備份的大小。 有關詳細信息,請參閱 sp_spaceused (Transact-SQL)。
2.為磁盤文件定義邏輯備份設備
2.1.限制和局限
邏輯設備名稱在服務器實例上的所有邏輯備份設備中必須是唯一的。 若要查看現有邏輯設備名稱,請查詢sys.backup_devices 目錄視圖。
2.2.建議
我們建議備份磁盤應不同於數據庫數據和日志的磁盤。 這是數據或日志磁盤出現故障時訪問備份數據必不可少的。
2.3使用 SQL Server Management Studio為磁盤文件定義邏輯備份設備
- 連接到相應的 Microsoft SQL Server 數據庫引擎實例之后,在對象資源管理器中,單擊服務器名稱以展開服務器樹。
- 展開“服務器對象”,然后右鍵單擊“備份設備”。
- 單擊“新建備份設備”。 將打開“備份設備”對話框。
- 輸入設備名稱。
- 若要確定目標位置,請單擊“文件”並指定該文件的完整路徑。
- 若要定義新設備,請單擊“確定”。
若要備份至新設備,右鍵設備名稱,選擇"back up a database",然后再具體的對話框中選擇需要備份的數據庫。如下圖所示:
2.4.使用 Transact-SQL為磁盤文件定義邏輯備份
--查詢備份設備 select * from sys.backup_devices; --定義磁盤備份設備 EXEC sp_addumpdevice 'disk', 'mybackupdisk', 'd:\backup\backup1.bak' ; --刪除磁盤備份設備 EXEC sp_dropdevice 'mybackupdisk', 'delfile' ;
3.創建完整數據庫備份 (SQL Server)
關於完整備份的點(PS:2012-7-17)
問題:sql server從2點開始備份,4點備份完。那么進行完整還原的時候,恢復到的是哪一個時間點。是2點,還是4點,或者是其他時間點。
解答:首先,恢復到的是4點。這是因為在進行full database backup的時候,會有一個開始備份的LSNs,在full database backup 完成的時候,又有一個備份完成的LSNe。在備份完成以后,數據庫會redo從LSNa到LSNb這一段log record。所以回復到的是4點。
執行如下命令
dbcc log(TESTDB3,3) checkpoint backup database TESTDB3 to disk='d:\backup\backup3.bak' dbcc log(TESTDB3,3)
查詢結果如下所示:
這說明進行backup的時候會被記錄到log record中。
3.1.限制和局限
-
不允許在顯式或隱式事務中使用 BACKUP 語句。
-
無法在早期版本的 SQL Server 中還原較新版本的 SQL Server 創建的備份。
3.2.建議
-
隨着數據庫不斷增大,完整備份需花費更多時間才能完成,並且需要更多的存儲空間。 因此,對於大型數據庫而言,您可以用一系列“差異數據庫備份”來補充完整數據庫備份。 有關詳細信息,請參閱差異備份 (SQL Server)。
-
您可以使用 sp_spaceused 系統存儲過程估計完整數據庫備份的大小。
-
默認情況下,每個成功的備份操作都會在 SQL Server 錯誤日志和系統事件日志中添加一個條目。 如果非常頻繁地備份日志,這些成功消息會迅速累積,從而產生一個巨大的錯誤日志,這樣會使查找其他消息變得非常困難。 在這些情況下,如果任何腳本均不依賴於這些日志條目,則可以使用跟蹤標志 3226 取消這些條目。 有關詳細信息,請參閱跟蹤標志 (Transact-SQL)。
3.3.權限
默認情況下,為 sysadmin 固定服務器角色以及 db_owner 和 db_backupoperator 固定數據庫角色的成員授予 BACKUP DATABASE 和 BACKUP LOG 權限。
備份設備的物理文件的所有權和權限問題可能會妨礙備份操作。 SQL Server 必須能夠讀取和寫入設備;運行 SQL Server 服務的帳戶必須具有寫入權限。 但是,用於在系統表中為備份設備添加項目的 sp_addumpdevice 不檢查文件訪問權限。 備份設備物理文件的這些問題可能直到為備份或還原而訪問物理資源時才會出現。
3.4.
使用 SQL Server Management Studio備份數據庫
右鍵數據庫AdventureWorks2012->tasks->back up,如下圖所示:
完全備份配置選項
- backup type:full,表示完全備份
- backup component:database
- backup set->name:默認
- backup set will expire:after:0,表示永遠不失效。
- destination:disk,表示備份到磁盤
- 點擊add選擇備份設備或者指定備份路徑,如下圖所示:
-
- 我們這里選擇的是前面創建的backup device:mybackupdisk。
- 注意:我們可以指定多個backup device。指定多個備份設備可以節約備份時間。並行寫入。
驗證
完成上述配置以后並確定備份,我們就可以在磁盤目錄”d:\backup\backup1.bak"下找到我們的備份文件,一共有189MB。
3.5.使用 Transact-SQL創建完整數據庫備份
--默認情況下,BACKUP DATABASE 創建完整備份。 --定義備份設備 EXEC sp_addumpdevice 'disk', 'mybackupdisk2', 'd:\backup\backup2.bak'; --備份到邏輯設備 BACKUP DATABASE AdventureWorks2012 TO mybackupdisk2 WITH NOINIT,NAME = 'Full Backup of AdventureWorks2012'; --直接備份到磁盤 BACKUP DATABASE AdventureWorks2012 TO disk='d:\backup\backup3.bak' WITH NOINIT,NAME = 'Full Backup of AdventureWorks2012';
BACKUP具體語法參考BACKUP (Transact-SQL)。
4.差異數據庫備份
4.1.必備條件
創建差異數據庫備份需要有以前的完整數據庫備份。 如果選定的數據庫從未進行過備份,則請在創建任何差異備份之前,先執行完整數據庫備份。 有關詳細信息,請參閱創建完整數據庫備份 (SQL Server)。
4.2.建議
當差異備份的大小增大時,還原差異備份會顯著延長還原數據庫所需的時間。 因此,建議按設定的間隔執行新的完整備份,以便為數據建立新的差異基准。 例如,您可以每周執行一次整個數據庫的完整備份(即完整數據庫備份),然后在該周內執行一系列常規的差異數據庫備份。
4.3.使用 SQL Server Management Studio創建差異數據庫備份
操作步驟跟3.4節完整備份數據庫一樣,只是將buckup type類型改成Differential而已。destination可以依然選擇完整備份的那一個device,不過要求是NOINIT,而不能是INIT,因為如果是INIT的話會覆蓋原來的完整備份。
4.4.使用 Transact-SQL創建差異數據庫備份
USE [TSQL2012] --定義備份設備 EXEC sp_addumpdevice 'disk', 'backupdevice1', 'd:\backup\backup_tsql2012.bak'; --完整備份數據庫 BACKUP DATABASE TSQL2012 TO backupdevice1 WITH NOINIT,NAME = 'Full Backup of TSQL2012'; --插入數據 INSERT INTO dbo.test(OrderID,ProductID) VALUES(1,1); INSERT INTO dbo.test(OrderID,ProductID) VALUES(2,2); INSERT INTO dbo.test(OrderID,ProductID) VALUES(3,3); --差異備份數據庫 BACKUP DATABASE TSQL2012 TO backupdevice1 WITH DIFFERENTIAL,NOINIT,NAME = 'DIFFERENTIAL Backup of TSQL2012';
驗證我們創建的完整備份和差異備份
右鍵選擇數據庫TSQL2012->tasks->restore->database,出現如下圖所示內容:
如上圖所示,出現了我們之前創建的完整備份和差異備份。
5.事務日志備份
5.1.建議
-
如果數據庫使用完整恢復模式或大容量日志恢復模式,則必須足夠頻繁地備份事務日志,以保護數據和避免事務日志變滿。 這將截斷日志,並且支持將數據庫還原到特定時間點。
-
默認情況下,每個成功的備份操作都會在 SQL Server 錯誤日志和系統事件日志中添加一個條目。 如果非常頻繁地備份日志,這些成功消息會迅速累積,從而產生一個巨大的錯誤日志,這樣會使查找其他消息變得非常困難。 在這些情況下,如果任何腳本均不依賴於這些日志條目,則可以使用跟蹤標志 3226 取消這些條目。 有關詳細信息,請參閱跟蹤標志 (Transact-SQL)。
5.2.使用 SQL Server Management Studio創建差異數據庫備份
5.2.1.例行事務日志的備份
5.2.2.尾部事務日志的備份
5.3.使用 Transact-SQL創建差異數據庫備份
--插入數據 INSERT INTO dbo.test(OrderID,ProductID) VALUES(4,4); INSERT INTO dbo.test(OrderID,ProductID) VALUES(5,5); --事務日志備份,NOINIT是默認的,表示不重寫,而是追加 BACKUP LOG TSQL2012 TO backupdevice1 WITH NAME = 'Transaction Log Backup of TSQL2012'; --插入數據 INSERT INTO dbo.test(OrderID,ProductID) VALUES(6,6); INSERT INTO dbo.test(OrderID,ProductID) VALUES(7,7); --結尾日志備份,如果報錯說數據庫正在使用,請重啟服務。 use master go BACKUP LOG TSQL2012 TO backupdevice1 WITH NORECOVERY,NAME = 'Transaction Tail-Log Backup of TSQL2012'; go
注意:事務日志備份與結尾日志備份就只差了一個關鍵字NORECOVERY,數據庫備份可以有多個事務日志,但是只有一個結尾日志。一般結尾日志多用在數據庫恢復的時候。在數據庫恢復中,恢復事務日志並不能說明數據庫已經恢復完成,但是一旦恢復了結尾日志,這表明數據庫恢復工作完成。
驗證我們創建的事務日志與結尾日志
右鍵選擇數據庫TSQL2012->tasks->restore->database,出現如下圖所示內容:
由上圖可見,備份中多出我們上述定義的事務日志:Transaction Log Backup of TSQL2012和結尾日志:Transaction Tail-Log Backup of TSQL2012。