Backup--还原选项之STANDBY

不少DBA对还原时制定RECOVERY 与 NORECOVERY选项都很熟悉,可是对于STANDBY就有点茫然了,今天一块儿来学习下吧。sql

--===================================================================数据库

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测试

--===================================================================spa

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

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

--==================================================================code

让咱们实验学习一下blog

--=============================
--建立数据库
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:\DB\TestDB4.mdf',  
MOVE N'TestDB3_log' TO N'D:\DB\TestDB4_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: 谁有奶茶妹高清大图,给小弟我传一份,我放到下个贴中。。

下班灰家,诸位周末快乐

相关文章
相关标签/搜索