很多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:\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: 谁有奶茶妹高清大图,给小弟我传一份,我放到下个贴中。。

下班灰家,诸位周末快乐

Backup--还原选项之STANDBY的更多相关文章

  1. Azure 中虚拟机的备份和还原选项

    可以通过定期创建备份来保护数据. 有多个备份选项可用于 VM,具体取决于使用案例. Azure 备份 若要备份运行生产工作负荷的 Azure VM,请使用 Azure 备份. Azure 备份对 Wi ...

  2. Sqlserver 还原

    --完整还原 RESTORE DATABASE demoData FROM DISK=N'D:\Backup\demoData.bak'; RESTORE DATABASE { database_na ...

  3. backup2:数据库还原

    数据库还原的操作,分两步进行:第一步,验证(verify)备份文件:第二步,根据备份策略还原数据库: 参考<backup1:开始数据库备份>,备份策略是: 一周一次完整备份,一天一次差异备 ...

  4. Azure SQL Database 时间点还原(Point in Time Restore)功能

      微软中国TechNet 7 Oct 2014 9:17 PM Comments 0 Likes 原文地址:http://blogs.technet.com/b/azuretw/archive/20 ...

  5. IIS7和IIS7.5备份和还原的方法

    windows2008的iis配置备份和iis6不同,在iis7中没有了6原来的保存配置xml的选项,而采用的是dos命令来进行iis7的备份.以下是win2008上iis7备份的方法. 首先打开CM ...

  6. iis7、iis8配置备份还原

    原文 iis7.iis8配置备份还原 方法1: 1.打开我们的IIS管理器,在功能视图里找到“共享的配置”这个功能然后双击进入. 2.进入“共享的配置”后单机右上方的“导出配置”选项,选择导出配置文件 ...

  7. mysql数据库全备和全备还原(使用Xtrabackup)

    一.使用innobackupex创建全备 语法 innobackupex --user=DBUSER --password=DBUSERPASS /path/to/backup/dir/ innoba ...

  8. 备份和还原 Linux 上的 SQL Server 数据库

    备份数据库 在下面的示例sqlcmd连接到本地 SQL Server 实例,并采用完整备份的名为的用户数据库demodb. sqlcmd -S localhost -U SA -Q "BAC ...

  9. MySQL数据库备份还原

    本文以CentOS 7 yum安装的MariaDB-server5.5为例,说明MySQL的几种 备份还原方式 将服务器A(192.168.1.100)上的数据库备份,还原到B(192.168.1.2 ...

随机推荐

  1. tf.unstack()、tf.stack()

    tf.unstack 原型: unstack( value, num=None, axis=0, name='unstack' ) 官方解释:https://tensorflow.google.cn/ ...

  2. 44-python-三维画图

    https://www.cnblogs.com/xingshansi/p/6777945.html python绘制三维图   作者:桂. 时间:2017-04-27  23:24:55 链接:htt ...

  3. 10-能不能组成m

    /*                                找数达人 时间限制:1000 ms  |  内存限制:65535 KB      难度:2 描述 小明最近做出了一道题:如何在一组数 ...

  4. Golang之beego读取配置信息,输出log模块

    1,准备好配置文件 [server] listen_ip = "0.0.0.0" listen_port = [logs] log_level=debug log_path=./l ...

  5. Linux dkpg命令

    一.简介 dpkg 是Debian Package 的简写,是Debian系列系统下的一个软件安装.更新及移除工具. 二.常用指令 1.查询功能 查看软件包信息: dpkg -info xxx.deb ...

  6. Ubuntu部分快捷键的使用简介

    1.切换到字符界面 Ctrl+Alt+F1 切换到tty1字符界面 Ctrl+Alt+F2 切换到tty2字符界面 Ctrl+Alt+F3 切换到tty3字符界面 Ctrl+Alt+F4 切换到tty ...

  7. 如何处理好前后端分离的 API 问题(转载自知乎)

    9 个月前 API 都搞不好,还怎么当程序员?如果 API 设计只是后台的活,为什么还需要前端工程师. 作为一个程序员,我讨厌那些没有文档的库.我们就好像在操纵一个黑盒一样,预期不了它的正常行为是什么 ...

  8. Spring.NET学习笔记6——依赖注入(应用篇)

    1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...

  9. memcached 连接本地问题

    刚开始学memcache ,就遇到一个问题. telnet 127.0.0.1 11211   回车之后就什么都没有提示了.然后不管设置什么都是报error . 表示不知道如何解决!先写个文章记录下来 ...

  10. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)

    传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码