備份 (Transact SQL) | Microsoft Docs https://docs.microsoft.com/zh-cn/sql/t-sql/statements/backup-transact-sql
還原 (Transact SQL) | Microsoft Docs https://docs.microsoft.com/zh-cn/sql/t-sql/statements/restore-statements-transact-sql
恢復模式
SQL Server 備份和還原操作發生在數據庫的恢復模式的上下文中。 恢復模式旨在控制事務日志維護。 “恢復模式”是一種數據庫屬性,它控制如何記錄事務,事務日志是否需要(以及允許)進行備份,以及可以使用哪些類型的還原操作。 有三種恢復模式:簡單恢復模式、完整恢復模式和大容量日志恢復模式。 通常,數據庫使用完整恢復模式或簡單恢復模式。 數據庫可以隨時切換為其他恢復模式。
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/recovery-models-sql-server
備份
完整備份
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/create-a-full-database-backup-sql-server
完整數據庫備份可對整個數據庫進行備份。 這包括對部分事務日志進行備份,以便在還原完整數據庫備份之后,能夠恢復完整數據庫備份。 完整數據庫備份表示備份完成時的數據庫。
例如 ( Transact-SQL)
下面的示例說明了如何使用 WITH FORMAT 覆蓋任意現有備份並創建新介質集,從而創建一個完整數據庫備份。 然后,此示例將備份事務日志。 在現實情況下,您必須執行一系列的定期日志備份。 在此示例中, AdventureWorks2012 示例數據庫設置為使用完整恢復模式。
USE master;
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO
-- Back up the AdventureWorks2012 database to new media set (backup set 1).
BACKUP DATABASE AdventureWorks2012
TO DISK = 'Z:\SQLServerBackups\AdventureWorks2012FullRM.bak'
WITH FORMAT;
GO
--Create a routine log backup (backup set 2).
BACKUP LOG AdventureWorks2012 TO DISK = 'Z:\SQLServerBackups\AdventureWorks2012FullRM.bak';
GO
差異備份
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/differential-backups-sql-server
差異備份所基於的是最近一次的完整數據備份。 差異備份僅捕獲自該次完整備份后發生更改的數據。 差異備份所基於的完整備份稱為差異的“基准” 。 完整備份(僅復制備份除外)可以用作一系列差異備份的基准,包括數據庫備份、部分備份和文件備份。 文件差異備份的基准備份可以包含在完整備份、文件備份或部分備份中。
優點
-
與創建完整備份相比,創建差異備份的速度可能非常快。 差異備份只記錄自差異備份所基於的完整備份后更改的數據。 這有助於頻繁地進行數據備份,減少數據丟失的風險。 但是,在還原差異備份之前,必須先還原其基准。 因此,從差異備份進行還原必然要比從完整備份進行還原需要更多的步驟和時間,因為這需要兩個備份文件。
-
如果數據庫的某個子集比該數據庫的其余部分修改得更為頻繁,則差異數據庫備份特別有用。 在這些情況下,使用差異數據庫備份,您可以頻繁執行備份,並且不會產生完整數據庫備份的開銷。
-
在完整恢復模式下,使用差異備份可以減少必須還原的日志備份的數量。
日志備份
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/transaction-log-backups-sql-server
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/apply-transaction-log-backups-sql-server
僅復制備份
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/copy-only-backups-sql-server
僅復制備份 是獨立於常規 SQL Server 備份序列的 SQL Server 備份。 通常,進行備份會更改數據庫並影響其后備份的還原方式。 但是,有時在不影響數據庫總體備份和還原過程的情況下,為特殊目的而進行備份還是有用的。 僅復制備份就是用於此目的。
恢復
完整數據庫還原(簡單恢復模式)
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/complete-database-restores-simple-recovery-model
數據庫完整還原的目的是還原整個數據庫。 整個數據庫在還原期間處於脫機狀態。 在數據庫的任何部分變為聯機之前,必須將所有數據恢復到同一點,即數據庫的所有部分都處於同一時間點並且不存在未提交的事務。
在簡單恢復模式下,數據庫不能還原到特定備份中的特定時間點。
用於還原完整數據庫備份的基本 Transact-SQLRESTORE 語法是:
RESTORE DATABASE database_name FROM backup_device [ WITH NORECOVERY ]
示例 (Transact-SQL)
以下示例首先顯示如何使用 BACKUP 語句來創建 AdventureWorks2012 數據庫的完整數據庫備份和差異數據庫備份。 然后按順序還原這些備份。 將數據庫還原到完成差異數據庫備份時的狀態。
該示例說明數據庫完整還原方案的還原序列中的關鍵選項。 還原順序 由通過一個或多個還原階段來移動數據的一個或多個還原操作組成。 將省略與此目的不相關的語法和詳細信息。 在恢復數據庫時,盡管 RECOVERY 選項是默認值,但為清楚起見,仍建議顯式指定該選項。
USE master;
--Make sure the database is using the simple recovery model.
ALTER DATABASE AdventureWorks2012 SET RECOVERY SIMPLE;
GO
-- Back up the full AdventureWorks2012 database.
BACKUP DATABASE AdventureWorks2012
TO DISK = 'Z:\SQLServerBackups\AdventureWorks2012.bak'
WITH FORMAT;
GO
--Create a differential database backup.
BACKUP DATABASE AdventureWorks2012
TO DISK = 'Z:\SQLServerBackups\AdventureWorks2012.bak'
WITH DIFFERENTIAL;
GO
--Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2012
FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012.bak'
WITH FILE=1, NORECOVERY;
--Restore the differential backup (from backup set 2).
RESTORE DATABASE AdventureWorks2012
FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012.bak'
WITH FILE=2, RECOVERY;
GO
完整數據庫還原(完整恢復模式)
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/complete-database-restores-full-recovery-model
將數據庫還原到故障點
通常,將數據庫恢復到故障點分為下列基本步驟:
-
備份活動事務日志(稱為日志尾部)。 此操作將創建結尾日志備份。 如果活動事務日志不可用,則該日志部分的所有事務都將丟失。
重要
在大容量日志恢復模式下,備份任何包含大容量日志操作的日志都需要訪問數據庫中的所有數據文件。 如果無法訪問該數據文件,則不能備份事務日志。 在這種情況下,您必須手動重做自最近備份日志以來所做的所有更改。
有關詳細信息,請參閱結尾日志備份 (SQL Server)。
-
還原最新完整數據庫備份而不恢復數據庫 (RESTORE DATABASE database_name FROM backup_device WITH NORECOVERY)。
-
如果存在差異備份,則還原最新的差異備份而不恢復數據庫 (RESTORE DATABASE database_name FROM differential_backup_device WITH NORECOVERY).。
還原最新差異備份可減少必須還原的日志備份數。
-
從還原備份后創建的第一個事務日志備份開始,使用 NORECOVERY 依次還原日志。
-
恢復數據庫 (RESTORE DATABASE database_name WITH RECOVERY)。 此步驟也可以與還原上一次日志備份結合使用。
下圖說明此還原順序。 故障發生后 (1),將創建結尾日志備份 (2)。 接着,將數據庫還原到該故障點。 這涉及到還原數據庫備份、后續差異備份以及在差異備份后執行的每個日志備份,包括結尾日志備份。
基本 TRANSACT-SQL RESTORE 語法
上圖中還原順序的基本 RESTORE Transact-SQL 語法如下:
-
RESTORE DATABASE database FROM full database backup WITH NORECOVERY;
-
RESTORE DATABASE database FROM full_differential_backup WITH NORECOVERY;
-
RESTORE LOG database FROM log_backup WITH NORECOVERY;
對於其他每個日志備份,重復此還原日志步驟。
-
RESTORE DATABASE database WITH RECOVERY;
示例:恢復到故障點 (Transact-SQL)
以下 Transact-SQL 示例顯示了將數據庫還原到故障點的還原順序中的基本選項。 此示例將創建數據庫的結尾日志備份。 接下來,此示例將還原完整數據庫備份和日志備份,然后還原結尾日志備份。 此示例將在最后的單獨步驟中恢復數據庫。
USE master;
--Create tail-log backup.
BACKUP LOG AdventureWorks2012
TO DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'
WITH NORECOVERY;
GO
--Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2012
FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'
WITH FILE=1,
NORECOVERY;
--Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks2012
FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'
WITH FILE=2,
NORECOVERY;
--Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks2012
FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'
WITH FILE=3,
NORECOVERY;
GO
--recover the database:
RESTORE DATABASE AdventureWorks2012 WITH RECOVERY;
GO
將數據庫還原到指定時間點
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/restore-a-sql-server-database-to-a-point-in-time-full-recovery-model
在完整恢復模式下,完整的數據庫還原通常可恢復到日志備份中的某個時間點、標記的事務或 LSN。 但是,在大容量日志恢復模式下,如果日志備份包含大容量更改,則不能進行時點恢復。
時點還原方案示例
下例假定針對一個關鍵任務型數據庫系統,每天午夜創建一個完整數據庫備份;從星期一到星期六,每小時創建一個差異數據庫備份;全天每 10 分鍾創建一個事務日志備份。 若要將數據庫還原到星期三凌晨 5:19 的狀態, 請執行以下操作:
-
還原星期二午夜創建的完整數據庫備份。
-
還原星期四凌晨 5:00 創建的差異數據庫 備份。
-
應用星期四凌晨 5:10創建的事務日志 備份。
-
應用星期三凌晨 5:20 創建的事務日志 備份,指定恢復進程僅應用到凌晨 5:19 之前發生的事務。
或者,如果需要將數據庫還原到它在星期四凌晨 3:04 的狀態, 而在星期四凌晨 3:00 創建的差異數據庫備份已不可用, 則執行下列操作:
-
還原在星期三午夜創建的數據庫備份。
-
還原星期四凌晨 2:00 創建的差異數據庫 備份。
-
應用從星期四凌晨 2:10 到 3:00 創建的所有事務 日志 備份。
-
應用星期四凌晨 3:10 創建的事務日志 備份,停止凌晨 3:04 的恢復進程。