很多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. hibernate联合主键

    @Entity @Table(name = "TABLE_NAME") @IdClass(PK.class) public class TableName implements S ...

  2. js简单校验form表单

    /** * 数据简单校验 */ function checkData (formId) { var check = true; var emailReg = new RegExp("^[a- ...

  3. 观察者模式 DataObserver

    DatasetObserver是Observer的一个子类 针对于adapter设计的 当调用notifydatasetchanged的时候就会触发回调的方法 adapter.registerObse ...

  4. discuz的diy功能介绍

    可以通过页面操作的方式,完成页面布局设计,数据聚合,样式等常见的页面处理功能.   以管理员登陆discuz的前台时,会出现一个diy按钮. 流程,先设计框架,再完成数据的聚合.     定义模板时, ...

  5. Spring框架的事务管理之基于AspectJ的XML方式(重点掌握)

    1. 步骤一:恢复转账开发环境(转账开发环境见“https://www.cnblogs.com/wyhluckdog/p/10137283.html”) 2.步骤二:引入AOP的开发包3.步骤三:引入 ...

  6. css hover使用条件

    1:必须是其子元素才可以使用: 举例: css: 正确:.group-goodsList ul li:hover .msct{background-color: #ff4000;color: #FFF ...

  7. doctotext

    文档解析库 http://www.it610.com/article/1936051.htm

  8. centos6.5 redis 安装配置及java调用

    1.安装gcc 执行命令  yum install gcc 2. 安装ruby环境 yum install ruby yum install rubygems gem install redis 下载 ...

  9. 百度词汇检索,计算PMI值

    '''词汇检索百度返回值,并且计算PMI值的类''' from bs4 import BeautifulSoup import requests import re import pandas as ...

  10. 2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)

    传送门 如果有n==m的条件就是卡特兰数. 但现在n不一定等于m. 我们可以考虑用求卡特兰数一样的方法来求答案. 我们知道有一种求卡特兰数的方法是转到二维平面求答案. 这道题就可以这样做. 我们将这个 ...