学习笔记(十三)——数据库备份还原的知识点与注意事项
一、备份还原基本概念
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
(SELECT 1 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'