一:有几种数据库备份的方式,就有几种数据库还原的方式
1:完整备份的还原
2:差异备份的还原(需要先还原最近的一个完整备份,然后还原最近的一个差异备份,如果在差异备份后还有事务日志备份,那么还应该还原事务日志备份)
3:事务日志的还原(需要先还原最近的一个完整备份,然后还原最近的一个差异备份 ,然后还原最近的一个差异备份后的所有事务日志备份)
4:数据文件和文件组的还原(通常只有数据库的某个文件或者文件组坏了才用这种还原)
二:还原数据库前需要注意的事项
1:检查要还原的备份文件盒备份设备是否有效(RESTORE VERIFYONLY FROM DISK=''或者RESTORE VERIFYONLY FROM 备份设备名称)
2:查看数据库的使用状态
如果这时有其他人在使用,则无法还原
三:还原数据库命令
1:用备份设备还原数据库(还原完整备份)
RESTORE DATABASE 数据库名称
FROM 备份设备名称
--注意:如果没有指定是用哪个备份设备集来还原,默认会用第一个备份集进行还原。如果要指定,需要用WITH FILE参数
如:
RESTORE DATABASE 数据库名称
FROM 备份设备名称
WITH FILE=N;
2:用备份文件还原数据库(还原完整备份)
RESTORE DATABASE 数据库名称
FROM DISK='备份文件路径名称'
3:还原差异备份
需要分两步操作。
第一步还原完整备份,
第二步还原差异备份。
除了最后一个还原操作,其他操作必须加上NORECOVERY或者STANDBY参数
4:还原事务日志备份
需要分三步操作。
第一步还原完整备份,
第二步还原差异备份,
第三步还原所有的事务日志备份。
除了最后一个还原操作,其他操作必须加上NORECOVERY或者STANDBY参数。
注意:最后一步的还原事务日志备份,可以是RESTOREDATABASE数据库名称 FROM 备份设备名称 WITH FILE=N.DATABASE也可以换成LOG.
5:还原文件和文件组备份
必须在数据库名称与FROM 之间加上FILE或者FILEGROUP来指定要还原的文件或者文件组。
通常,在还原文件和文件组备份 后,还要还原其他事务日志备份来获得最近的数据库状态。
如:
RESTORE DATABASE 数据库名称 FILE\FILEGROUP=''
FROM 备份设备
--备份之后所有的事务日志备份
RESTORE LOG 数据库名称
FROM 备份设备
6:将数据还原到某个时间点
假如数据库,在上午8点做了一个完全备份,10点做了一个事务日志备份,现在发现9:15分的一次数据更新时错误的,那么能恢复到9点14分时的数据库状态,还是只能恢复到10点所做的事务日志备份时的状态呢?
事务日志的作用就是记录数据库的每次修改,所以可以恢复到任何一次操作之前的状态。9点15分时的记录是错误的,那就可以将其恢复到9点14时的数据。
四:具体备份还原示例
PS:下面有好几个还原例子,并且是连贯的,请按照顺序看,便于理解。
如:我在2013-12-12 13:34:13.000对TEST库做了一个完整备份(
RESTORE HEADERONLY FROM 我的备份设备1里面的BACKUPSTARTTIME这里能看到时间
)。
USE TEST;
SELECT *
FROM T2;
现在表里数据是空的,如下所示:
往表里插入两条数据
INSERT INTO T2(ID2) VALUES(1),(2);
查询结果:
此时,做个差异备份
BACKUP DATABASE TEST TO 我的备份设备1 WITH DIFFERENTIAL ;
接下来做个清除T2数据的操作
DELETE
FROM T2;
现在表里数据是空的,如下所示:
然后做个事务日志备份
BACKUP LOG TEST TO 我的备份设备1
再插入两条记录
INSERT INTO T2(ID2) VALUES(3),(4);
SELECT *
FROM T2;
现在,再做一个事务日志备份
BACKUP LOG TEST TO 我的备份设备1
怎么恢复之前删掉的那两条数据呢?
恢复步骤:
1:查看备份集信息
RESTORE HEADERONLY FROM 我的备份设备1
看到刚做的完全备份编号是8,差异备份编号是9.两个事务日志备份是10,1
2:检查者两个备份集是否有效
RESTORE VERIFYONLY
FROM 我的备份设备1
WITH FILE=8
RESTORE VERIFYONLY
FROM 我的备份设备1
WITH FILE=9
3:恢复完全备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=8,NORECOVERY,REPLACE
4:恢复差异备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=9
5:现在再查看一下
USE TEST;
SELECT *
FROM T2;
还原回来啦,嘎嘎……
假如,我现在又想要回3,4那两条数据,应该怎么办呢?
那就需要还原事务日志备份了。
恢复步骤:
1:查看备份集信息
RESTORE HEADERONLY FROM 我的备份设备1
--这一步可以省略了,因为上面已经查过了,知道事务日志备份编号是10,11了。
2:检查者两个备份集是否有效
RESTORE VERIFYONLY
FROM 我的备份设备1
WITH FILE=11
RESTORE VERIFYONLY
FROM 我的备份设备1
WITH FILE=10
3:恢复完全备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=8,NORECOVERY,REPLACE
4:恢复差异备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=9
5:还原事务日志备份
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=10,NORECOVERY
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=11
现在再查看一下,就回来啦
USE TEST;
SELECT *
FROM T2;
--------------试验将数据库还原到某一时间点----------
我在2013-12-12 18:16分做了如下操作。
DELETE
FROM T2
WHERE ID2=3
然后做了个事务日志备份
BACKUP LOG TEST TO 我的备份设备1
现在,我想恢复ID2为3的这条数据。
步骤:
1:查看备份集信息
RESTORE HEADERONLY FROM 我的备份设备1
--事务日志备份编号是12了。
2:检查这个备份集是否有效(前面的都验证过了,所以验证这个一共就行了)
RESTORE VERIFYONLY
FROM 我的备份设备1
WITH FILE=12
3:恢复完全备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=8,NORECOVERY,REPLACE
4:恢复差异备份
USE master;
RESTORE DATABASE TEST
FROM 我的备份设备1
WITH FILE=9
5:还原事务日志备份
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=10,NORECOVERY
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=11,NORECOVERY
--由于18:16分删掉的,所以恢复到18:15分的状态
USE master
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=12,STOPAT ='2013-12-12 18:15'
6:现在查看一下,为3的那条数据有了。
USE TEST;
SELECT *
FROM T2;
结果省略……
五:将文件还原到新位置上
假如磁盘故障了,我想把TEST库的数据文件和日志文件放到另一个位置。
限制和局限
还原文件的系统管理员必须是唯一一位当前使用要还原的数据库的人。
不允许在显式或隐式事务中使用 RESTORE。
在完整恢复模式或大容量日志恢复模式下,必须先备份活动事务日志(称为日志尾部),然后才能还原文件。 有关详细信息,请参阅备份事务日志 (SQL Server)。
若要还原已加密的数据库,您必须有权访问用于加密数据库的证书或非对称密钥。 如果没有证书或非对称密钥,数据库将无法还原。 因此,只要需要该备份,就必须保留用于对数据库加密密钥进行加密的证书。 有关详细信息,请参阅 SQL Server 证书和非对称密钥。
步骤:
(可选)执行 RESTORE FILELISTONLY 语句,以确定完整数据库备份中的文件数及名称。
-
执行 RESTORE DATABASE 语句可以还原完整数据库备份,同时指定:
要还原的数据库的名称。
从中还原完整数据库备份的备份设备。
为每个要还原到新位置的文件指定 MOVE 子句。
NORECOVERY 子句。
-
如果在创建文件备份之后对文件进行了修改,则执行 RESTORE LOG 语句以应用事务日志备份,同时指定下列内容:
事务日志将应用到的数据库的名称。
要还原的事务日志备份的备份设备。
-
如果在应用当前事务日志备份之后还要应用其他事务日志备份,则指定 NORECOVERY 子句;否则指定 RECOVERY 子句。
事务日志备份(如果已应用)必须包含备份文件和文件组时的时间。
示例:
将数据库TEST还原到位置:D:\丹丹\My SQL SERVER\数据文件和日志文件
1:RESTORE FILELISTONLY FROM 我的备份设备1
2:RESTORE HEADERONLY FROM 我的备份设备1
看到还原的话需要8,9,10,11,12这几个备份
3:
USE master
RESTORE DATABASE test--注意:这里还可以为数据库重命名
FROM 我的备份设备1
WITH FILE=8,NORECOVERY,REPLACE,
MOVE 'test' TO 'D:\丹丹\My SQL SERVER\数据文件和日志文件\test01.mdf',
MOVE 'test_log' TO 'D:\丹丹\My SQL SERVER\数据文件和日志文件\test_log01.ldf'
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=9,NORECOVERY
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=10,NORECOVERY
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=11,NORECOVERY
RESTORE DATABASE test
FROM 我的备份设备1
WITH FILE=12
4:验证一下是否移动了新的位置
USE TEST;
SELECT *
FROM SYSFILES;
5:然后对现在的库做个全备
BACKUP DATABASE TEST TO 我的备份设备1