Backup--还原选项之STANDBY

很多DBA对还原时制定RECOVERY 与 NORECOVERY选项都很熟悉,但是对于STANDBY就有点茫然了,今天一起来学习下吧。

--===================================================================

MSDN如下说:

STANDBY =standby_file_name
指定一个允许撤消恢复效果的备用文件。
备用文件用于为 RESTORE WITH STANDBY 的撤消过程中修改的页面保留一个“写入时副本”预映像。备用文件允许用户在事务日志还原期间以只读方式访问数据库,并允许数据库用于备用服务器情形,或用于需要在日志还原操作之间检查数据库的特殊恢复情形。执行完 RESTORE WITH STANDBY 操作之后,下一个 RESTORE 操作会自动删除撤消文件。如果在下一个 RESTORE 操作之前手动删除了这个备用文件,则必须重新还原整个数据库。当数据库处于 STANDBY 状态时,您应将这个备用文件视为和任何其他数据库文件同样重要。该文件与其他数据库文件不同,数据库引擎仅在活动还原操作过程中持续打开该文件。
给定备用文件的大小要求取决于由还原操作过程中未提交的事务所导致的撤消操作数。

链接地址:http://msdn.microsoft.com/zh-cn/library/ms178615(v=sql.105).aspx

--===================================================================

按我的理解来讲:就是在还原时,将未提交的事务写入到一个“备用文件”中,然后回滚未提交事务,保证数据一致性,将数据库设置为“备用/只读”状态,使用户可以访问数据库,并能在后续继续使用日志备份来还原数据库。

日志传送中备用节点可读便是使用这种方式

--==================================================================

让我们实验学习一下

--=============================
--创建数据库
CREATE DATABASE TestDB3
GO
USE TestDB3
GO
--=============================
--创建测试表
SELECT * INTO TB01 
FROM sys.all_columns
WHERE 1<>1

GO
--==============================
--创建完整备份
BACKUP DATABASE TestDB3 TO DISK ='D:TestDB3_F1.BAK'

--==============================
--向测试表中插入100条数据并提交事务
INSERT INTO TB01
SELECT TOP(100) * FROM sys.all_columns


--================================
--新开向测试表插入1000条数据,暂时不提交
BEGIN TRAN 

DECLARE @ID INT 
SET @ID=10
WHILE(@ID>0)
BEGIN
INSERT INTO TB01
SELECT TOP(100) * FROM sys.all_columns
SET @ID=@ID-1
END

我们再开启一个回话,做第一次日志备份

--===========================================
--第一次日志备份,包含一个100条插入的已提交事务
--和一个1000条插入的未提交事务
BACKUP LOG TestDB3 TO DISK ='D:TestDB3_L1.BAK'

然后回到第一个回话,提交事务并做第二日志备份

--===========================================
--提交事务并做第二次日志备份,包含一个100条插入
--的已提交事务和一个1000条插入的已提交事务
BACKUP LOG TestDB3 TO DISK ='D:TestDB3_L2.BAK'

此时我们有一个完整备份和两个日志备份,让我们来还原数据库

--========================================================
--使用完整备份来还原数据库[TestDB4],并指定NORECOVERY来使得
--数据库处于"正在还原"状态
RESTORE DATABASE [TestDB4] FROM  DISK = N'D:TestDB3_F1.BAK' 
WITH  FILE = 1,  MOVE N'TestDB3' TO N'D:DBTestDB4.mdf',  
MOVE N'TestDB3_log' TO N'D:DBTestDB4_1.LDF',  
NORECOVERY,  NOUNLOAD,  STATS = 10
GO
--======================================================
--使用日志备份来还原,使用STANDBY选项来使得数据库处于"备用/只读"
RESTORE LOG [TestDB4] FROM  DISK = N'D:TestDB3_L1.BAK' 
WITH  STANDBY = N'D:ROLLBACK_UNDO_TestDB4.BAK',  
NOUNLOAD,  STATS = 10

此时数据库可以访问,查询表会发现表中有100条数据,恰好是第一个提交事务的数据,第二个未提交事务插入的1000条数据无法查询到。
再来查看STANDBY指定的文件

继续还原日志

--===============================================
--继续还原日志备份
BACKUP LOG TestDB3 TO DISK ='D:TestDB3_L1.BAK'

会发现可以正常还原!

我们重做上面还原步骤,但在最后一次还原日志之前,把STANDBY指定的文件删除掉,会有以下错误提示:

消息 3441,级别 17,状态 1,第 3 行
在启动备用数据库 'TestDB4' (数据库 ID 为 10)的过程中,RESTORE 语句无法访问它的备用文件('D:ROLLBACK_UNDO_TestDB4.BAK')。
操作系统错误为 '2(系统找不到指定的文件。)'。诊断该操作系统错误,并更正此问题,然后重试启动操作。

PS:在生产环境,不要轻易删除STANDBY指定的文件哦,要不你就“哭吧哭吧不是罪啦”

--============================================================================================

让我们继续试验

对于“备用/只读”的数据库,我们使用使用RESTORE方式来将其修改为“正在还原”状态

--=========================================
--使用 RESTORE 来将数据库重置为"正在还原状态"
RESTORE DATABASE TestDB4 WITH NORECOVERY

而且还可以继续使用后续日志备份来还原,证明上面语句使用STANDBY指定的文件来还原了数据库。

PS:当数据库被还原到“正在还原”状态后,STANDBY指定的文件会被默认删除掉哦。

既然“备用/只读”状态可以利用还原来转变成“正在还原”状态,那么“正在还原”状态是不是也可以使用还原来转变成“备用/只读”呢?答案是肯定滴

--============================================
--使用RESTORE 来将数据库从"正在还原"状态转变成"备用/只读"状态
RESTORE DATABASE TestDB4 
WITH  STANDBY = N'D:ROLLBACK_UNDO_TestDB4.BAK'

--============================================================================================

打完收工,妹子镇贴

PS: 谁有奶茶妹高清大图,给小弟我传一份,我放到下个贴中。。

下班灰家,诸位周末快乐

原文地址:https://www.cnblogs.com/TeyGao/p/3673965.html