學習筆記(十三)——數據庫備份還原的知識點與註意事項
阿新 • • 發佈:2017-12-20
差異 並且 rom esc 每次 sel exe tor 參數
學習筆記(十三)——數據庫備份還原的知識點與註意事項
一、備份還原基本概念
1、 完整備份:完整備份因為需要備份的數據量大,所以需要在空閑時間進行,並且定期進行。
2、 日誌備份:日誌備份的數據量小,備份時間為上一次備份到本次本分期間的數據,每天都可以進行備份,或者每小時都可以進行備份,據所需備份。
3、 增量備份(差異備份):只備份修改過的數據,與每小時進行的日誌備份配合使用,效率更高。
二、備份設備
1、 在進行備份數據的保存時,需要輸入的文件路徑很長,並且每次都要輸入,難免麻煩費事,所以我們先給文件路徑取好別名,即備份設備,以便之後書寫代碼的方便。
2、 相關語句
IF EXISTS (SELECT 1 FROM sys.backup_devices AS BD WHERE BD.name = ‘dp_EduBase_FullBackup‘) EXEC sp_dropdevice ‘dp_EduBase_FullBackup‘; EXEC sp_addumpdevice ‘DISK‘,‘dp_EduBase_FullBackup‘,‘C:\EduBase\Backup\Full\dp_EduBase_FullBackup.bak‘; IF EXISTS (SELECT1 FROM sys.backup_devices AS BD WHERE BD.name = ‘dp_EduBase_DiffBackup‘) EXEC sp_dropdevice ‘dp_EduBase_DiffBackup‘; EXEC sp_addumpdevice ‘DISK‘,‘dp_EduBase_DiffBackup‘,‘C:\EduBase\Backup\Diff\dp_EduBase_DiffBackup.bak‘; IF EXISTS (SELECT 1 FROM sys.backup_devices AS BD WHERE BD.name = ‘dp_EduBase_LogBackup‘) EXEC sp_dropdevice ‘dp_EduBase_LogBackup‘; EXEC sp_addumpdevice ‘DISK‘,‘dp_EduBase_LogBackup‘,‘C:\EduBase\Backup\Log\dp_EduBase_LogBackup.bak‘;
一、為數據庫做備份
1、 完整備份
USE EduBase; DECLARE @FullBkDesc VARCHAR(MAX); //申明備份設備 SELECT @FullBkDesc = ‘Weekly full backup for ‘+DB_NAME()+‘ at ‘+DATENAME(YEAR,GETDATE())+‘,week ‘+DATENAME(WEEK,GETDATE())+‘.(‘+CONVERT(VARCHAR,GETDATE(),120)+‘)‘; BACKUP DATABASE EduBase TO dp_EduBase_FullBackup WITH INIT //INIT操作可以初始化文件,即可以覆蓋掉之前的備份,保留本次操作過後的備份 ,Name = ‘EduBase_FullBackup‘ ,DESCRIPTION = @FullBkDesc;
2、 日誌備份
DECLARE @LogBkDesc VARCHAR(MAX); SELECT @LogBkDesc = ‘Hourly log backup for ‘+DB_NAME()+‘ at ‘+DATENAME(YEAR,GETDATE())+‘,week ‘+DATENAME(WEEK,GETDATE())+‘,day ‘+CONVERT(VARCHAR,DATEPART(W,GETDATE())-1)+‘,hour ‘+CONVERT(VARCHAR,DATEPART(HOUR,GETDATE()))+‘.(‘+CONVERT(VARCHAR,GETDATE(),120)+‘)‘; BACKUP LOG EduBase TO dp_EduBase_LogBackup WITH INIT ,Name = ‘EduBase_LogBackup‘ ,DESCRIPTION = @LogBkDesc;
4、 添加描述
為日誌文件添加時間等描述,便於之後的查看以及還原時的操作
SELECT @DiffBkDesc = ‘Daily Differential backup for ‘+DB_NAME()+‘ at ‘+DATENAME(YEAR,GETDATE())+‘,week ‘+DATENAME(WEEK,GETDATE())+‘,day ‘+CONVERT(VARCHAR,DATEPART(W,GETDATE())-1)+‘.(‘+CONVERT(VARCHAR,GETDATE(),120)+‘)‘; //采用GETDATE()函數分別獲取年、月、日,用連接字符串的方法拼接後賦值給參數
1、 註意
增量備份和日誌備份第一次使用過後,之後的代碼中不可使用INIT操作,否則,之前的數據會被覆蓋掉,無法實現所有數據的還原以及修復。
一、數據還原
(一) 操作步驟
1、 使用RESTORE HEADERONLY
FROM (文件名)查看數據備份文件的情況。查看過後確定應該恢復哪些日誌備份文件(除最後兩次的修改期間需要用到日誌備份之外,其余的還原增量備份即可)
2、 還原增量備份
3、 還原結尾日誌前一份操作的日誌備份
4、 還原結尾日誌的備份
(二)實現代碼
1、查看備份信息
DECLARE @TailLogBkPath VARCHAR(MAX); SELECT @TailLogBkPath = ‘C:\EduBase\Backup\Log\EduBase_TailLogBackup_‘+CONVERT(VARCHAR(10),GETDATE(),120)+‘.bak‘ RESTORE HEADERONLY FROM dp_EduBase_FullBackup; RESTORE HEADERONLY FROM dp_EduBase_DiffBackup; RESTORE HEADERONLY FROM dp_EduBase_LogBackup; RESTORE HEADERONLY FROM DISK = @TailLogBkPath;
2、還原數據
DECLARE @TailLogBkPath VARCHAR(MAX); SELECT @TailLogBkPath = ‘C:\EduBase\Backup\Log\EduBase_TailLogBackup_‘+CONVERT(VARCHAR(10),GETDATE(),120)+‘.bak‘ RESTORE DATABASE EduBase FROM dp_EduBase_FullBackup WITH FILE = 1 //指定備份設備內的文件位置 ,REPLACE //若指定覆蓋則不檢查當前數據庫備份與備份數據庫的名稱、GUID等是否一致,不檢查是否已備份結尾日誌 ,NORECOVERY; //數據庫未還原,未提交事物將不會被回滾,若後續還原結束後認為提交,方才回滾 RESTORE DATABASE EduBase FROM dp_EduBase_LogBackup WITH FILE = 1 ,NORECOVERY; RESTORE DATABASE EduBase FROM dp_EduBase_LogBackup WITH FILE = 2 ,NORECOVERY; RESTORE DATABASE EduBase FROM DISK = @TailLogBkPath WITH FILE = 1 ,RECOVERY; //數據庫完成還原
3、差異備份
DECLARE @DiffBkDesc VARCHAR(MAX);
SELECT
@DiffBkDesc = ‘Daily Differential backup for ‘+DB_NAME()+‘ at ‘+DATENAME(YEAR,GETDATE())+‘,week ‘+DATENAME(WEEK,GETDATE())+‘,day ‘+CONVERT(VARCHAR,DATEPART(W,GETDATE())-1)+‘.(‘+CONVERT(VARCHAR,GETDATE(),120)+‘)‘;
BACKUP DATABASE EduBase
TO dp_EduBase_DiffBackup
WITH
DIFFERENTIAL //實現備份當前有變化的數據
,INIT
,Name = ‘EduBase_DiffBackup‘
學習筆記(十三)——數據庫備份還原的知識點與註意事項