原文:SQL Server的还原

1.差异备份的还原

不备份结尾日志的情况下还原数据

创建差异备份的放在我们已经在前面一篇博客SQL Server的备份中提到了,这里我们不再赘述,下面我们给出差异备份与还原的T-SQL方法,代码如下:

--创建备份设备
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_1', 'd:\backup\MyAdvWorks_1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_diff1', 'd:\backup\MyAdvWorks_diff1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_log1', 'd:\backup\MyAdvWorks_log1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_log2', 'd:\backup\MyAdvWorks_log2.bak'; --数据库备份阶段
-- 创建完整备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_1
WITH INIT;
GO
-- 在完整备份之后创建差异备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_diff1
WITH DIFFERENTIAL;
GO --数据库还原阶段
-- 完整还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_1
WITH NORECOVERY;
GO
-- 在完整还原之后差异还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_diff1
WITH RECOVERY;
GO

在执行上述完整还原的时候,SSMS报错,错误内容如下:

Msg 3159, Level 16, State 1, Line 2
The tail of the log for the database "MyAdvWorks" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of the RESTORE statement to just overwrite the contents of the log.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

这是因为,对于使用完全恢复模式或大容量日志恢复模式的数据库,在大多数情况下,您必须在还原数据库前备份日志的结尾。 还原数据库而不首先备份日志的末尾将导致错误,除非 RESTORE DATABASE 语句包含 WITH REPLACE 或 WITH STOPAT 子句,此子句必须指定数据备份的结束时间或在数据备份结束之后发生的事务。 有关结尾日志备份的详细信息,请参阅结尾日志备份 (SQL Server)。RESTORE的语法可以参考RESTORE (Transact-SQL)。为了解决上述错误,我们将完整还原的TSQL语句修改如下:

-- 完整还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_1
WITH REPLACE,NORECOVERY;
GO

REPLACE 选项的影响

应尽可能避免使用 REPLACE,而且在使用该选项之前必须仔细考虑。 还原一般会防止意外使用一个数据库覆盖另一个数据库。 如果 RESTORE 语句中指定的数据库已存在于当前服务器上,并且指定的数据库系列 GUID 与备份集中记录的数据库系列 GUID 不同,则不还原该数据库。 这是一项重要的安全保护措施。

使用 REPLACE 选项后,就会忽略还原时通常执行的几项重要安全检查。 忽略的检查如下:

  • 还原时使用其他数据库的备份覆盖现有数据库。

    使用 REPLACE 选项后,即使指定的数据库名称与备份集中记录的数据库名称不同,还原也允许您使用备份集中任何一个数据库覆盖现有数据库。 这会导致一个数据库意外覆盖另一个数据库。

  • 在没有获取结尾日志备份并也没有使用 STOPAT 选项的情况下,使用完整恢复模式或大容量日志恢复模式对数据库进行还原。

    使用 REPLACE 选项后,由于没有备份最近写入的日志,您会丢失提交的作业。

  • 覆盖现有文件。

    例如,可能会错误地覆盖错误类型的文件,如 .xls 文件或非联机状态的其他数据库正在使用的文件等。 如果覆盖现有文件,则即使所还原的数据库是完整的,也有可能丢失某些数据。

RECOVERY 和 NORECOVERY 的比较

仔细观察上述完整还原和差异还原的TSQL语句,我们可以看到在完整还原阶段,使用了WITH NORECOVERY,而差异还原,则是使用了RECOVERY

  • NORECOVERY 指定不发生回滚。 从而使前滚按顺序在下一条语句中继续进行。在这种情况下,还原顺序可还原其他备份,并执行前滚。
  • RECOVERY(默认值)表示,应在完成当前备份前滚之后执行回滚。恢复数据库要求要还原的整个数据集(“前滚集”)必须与数据库一致。 如果前滚集尚未前滚到与数据库保持一致的地步,并且指定了 RECOVERY,则数据库引擎将发出错误。
  • 因此RESTORE...WITH RECOVERY状态就表明此时数据库已经处于一致性状态了。一般都是数据库还原的最后一步才会使用RESTORE...WITH RECOVERY,其他时候都是使用RESTORE...WITH NORECOVERY。

前滚与回滚的区别

前滚和回滚是 SQL Server中的两个事务操作。

  • 前滚用于恢复之前的操作。

  比如:执行一个删除一条记录的命令,刚刚把该操作的日志写完(即在日志中已经commit),并准备执行删除操作时,但是此时停电了,因此这条记录的删除工作没有完成。在下次启动SQL Server时,数据库会读取日志最近的一个检查点(checkpoint),然后重做所有已经commit的事务,这就包括之前删除记录的操作。

  • 回滚用于撤销之前的操作。

  比如:我要执行一个银行转账的事务,从账户A中转出1000元到账户B中,在我执行完A-1000的时候,数据库down掉了,此时整个事务还没有执行完,因此事uncommitted的。所以在下次启动SQL Server的时候,数据库会读取日志最近的一个检查点(checkpoint),回滚所有那些uncommitted的事务。比如在这里会撤销A-1000的操作,也就是会往A账户中加回去1000元。

2.事务日志的还原

在数据库中,使用最频繁的应该是事务日志的备份,那么下面就讲讲事务日志的备份与还原。TSQL代码如下:
--开始:实验2:事务日志备份与---------------------------------------------
--创建备份设备
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_1', 'd:\backup\MyAdvWorks_1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_diff1', 'd:\backup\MyAdvWorks_diff1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_log1', 'd:\backup\MyAdvWorks_log1.bak';
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_log2', 'd:\backup\MyAdvWorks_log2.bak'; --数据库备份阶段
-- 创建完整备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_1
WITH INIT;
GO
-- 在完整备份之后创建差异备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_diff1
WITH DIFFERENTIAL;
GO
--事务日志备份
BACKUP LOG MyAdvWorks
TO MyAdvWorks_log1;
GO --数据库还原阶段----------
--结尾日志备份,结尾日志备份在还原阶段,在restore之前先进行结尾日志备份
use master
BACKUP LOG MyAdvWorks
TO MyAdvWorks_log2
WITH INIT,
NORECOVERY;
GO
-- 完整还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_1
WITH NORECOVERY;
GO
-- 差异还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_diff1
WITH NORECOVERY;
GO
--事务日志还原
RESTORE LOG MyAdvWorks
FROM MyAdvWorks_log1
WITH NORECOVERY;
GO
--结尾日志还原
RESTORE LOG MyAdvWorks
FROM MyAdvWorks_log2
WITH RECOVERY;
GO
--结束:实验2---------------------------------------------

3.备份到一个逻辑设备中

观察上面的备份我们可以发现,我们创建了四个逻辑备份设备,分别用户存储完整备份,差异备份,事务日志备份和结尾日志备份。然后恢复的时候也是指定到这四个不同的备份设备,但是当我们只创建一个备份设备,并且备份到同样一个备份设备的时候。备份工作可以完成,还原工作就不能完成了。比如如何区分差异还原和完全还原,如何区分事务日志还原和结尾日志还原。因此无法通过TSQL进行精确还原。

但是使用SSMS的话,我们可以在一个逻辑设备,并且进行精确还原。

解决问题(PS:2012-7-9)

今天在使用restore stopat的时候看到了restore中有file关键字,并且在备份的时候在message中看到了file 1等字段,所以我就想这个file是不是就是备份集呢?后来验证是的,因此也就找到了使用一个逻辑设备进行备份还原的方法。代码示例如下

--开始:实验2:事务日志备份与---------------------------------------------
--创建备份设备
EXEC sp_addumpdevice 'disk', 'MyAdvWorks_1', 'd:\backup\MyAdvWorks_1.bak'; --数据库备份阶段
-- 创建完整备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_1
WITH INIT;
GO
/*
Processed 280 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 1.
Processed 2 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 1.
BACKUP DATABASE successfully processed 282 pages in 0.257 seconds (8.568 MB/sec).
*/ -- 在完整备份之后创建差异备份
BACKUP DATABASE MyAdvWorks
TO MyAdvWorks_1
WITH DIFFERENTIAL;
GO
/*
Processed 40 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 2.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 2.
BACKUP DATABASE WITH DIFFERENTIAL successfully processed 41 pages in 0.108 seconds (2.965 MB/sec).
*/ --事务日志备份
BACKUP LOG MyAdvWorks
TO MyAdvWorks_1;
GO
/*
Processed 4 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 3.
BACKUP LOG successfully processed 4 pages in 0.078 seconds (0.338 MB/sec).
*/ --数据库还原阶段----------
--结尾日志备份,结尾日志备份在还原阶段,在restore之前先进行结尾日志备份
BACKUP LOG MyAdvWorks
TO MyAdvWorks_1
WITH NORECOVERY;
GO
/*
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 4.
BACKUP LOG successfully processed 1 pages in 0.059 seconds (0.041 MB/sec).
*/ -- 完整还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_1
WITH FILE=1,
NORECOVERY;
GO
/*
Processed 280 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 1.
Processed 2 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 1.
RESTORE DATABASE successfully processed 282 pages in 0.363 seconds (6.066 MB/sec).
*/ -- 差异还原
RESTORE DATABASE MyAdvWorks
FROM MyAdvWorks_1
WITH FILE=2,
NORECOVERY;
GO
/*
Processed 40 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 2.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 2.
RESTORE DATABASE successfully processed 41 pages in 0.129 seconds (2.483 MB/sec).
*/ --事务日志还原
RESTORE LOG MyAdvWorks
FROM MyAdvWorks_1
WITH FILE=3,
NORECOVERY;
GO
/*
Processed 0 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 3.
Processed 4 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 3.
RESTORE LOG successfully processed 4 pages in 0.044 seconds (0.599 MB/sec).
*/ --结尾日志还原
RESTORE LOG MyAdvWorks
FROM MyAdvWorks_1
WITH FILE=4,
RECOVERY;
GO
/*
Processed 0 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 4.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 4.
RESTORE LOG successfully processed 1 pages in 0.019 seconds (0.128 MB/sec).
*/
--结束:实验2---------------------------------------------

在备份的时候,message中显示文件被备份到了哪一个file中,所以在restore的时候,指定file序号就可以执行还原了。

 

SQL Server的还原的更多相关文章

  1. SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  2. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  3. SQL Server 备份还原

    SQL Server支持三种备份方式 完全备份: 差异备份 事务日志备份 一般备份方式为,完全备份/每周,差异备份/每天,事务日志备份/按分钟计,这样可确保备份的高效性和可恢复性. 1. 完全备份 备 ...

  4. [转]SQL SERVER数据库还原的方法

    SQL SERVER数据库还原的方法 在SQL SERVER 2005下还原数据库 1.新建数据库A,右键还原数据库,此时目标数据库为A,选择备份 文件B_db_201311040200.BAK,还原 ...

  5. SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  6. SQL Server 数据库还原进度查看

    SQL Server 数据库还原进度查看 关键字:数据库,还原,进度,查看 文档说明: 本文档受某实际需求启发,某约500G大小数据库还原,由于对应服务器性能较差(内存仅4G且可用内存仅2.8G),数 ...

  7. Sql Server 备份还原失败错误ERROR:3145(备份集中的数据库备份与现有的数据库不同)及解决办法

    SQL Server备份文件bak,备份后还原出现错误3145,备份集中的数据库备份与现有的 'xxx' 数据库不同. 解决办法如下: 1,新建一个与现有数据库重名的数据库. 如果您不知道数据库名称, ...

  8. Sql server 备份还原后出现“受限制用户”问题

    http://jingyan.baidu.com/article/eb9f7b6dcbf1ea869264e856.html SQL数据库作备份和还原操作几乎是日常性事务了.但某次在对Sql Serv ...

  9. SQL Server数据库还原:"因为数据库正在使用,所以无法获得对数据库的独占访问权"

    如题,网上找了一些客套的方法,如果不想去折腾,请看我的方法: 1.先脱机数据库,这个目的就是为了停掉所有链接 2.选择还原数据库,如果提示日志尾部不完整,请选择数据库属性的选项,覆盖现有数据. 还可以 ...

随机推荐

  1. Word文件交换的电脑打开字体、排版变化的原因和解决方法!

    方案: 有时候.我们好不easy用Word写好文档,做好排版发给别人,别人会告诉你格式怎么是乱的啊,标题.正文.页眉页脚什么的格式都变了. 想尽各种办法都没能得到解决,那么出现这样的情况的原因究竟是什 ...

  2. Python 清理HTML标签相似PHP的strip_tags函数功能(二)

    没有发现Python 有现成的类似功能模块,所以昨天写了个简单的 strip_tags 但还有些问题,今天应用到採集上时进行了部分功能的完好, 1. 对自闭和标签处理 2. 以及对标签參数的过滤 fr ...

  3. HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...

  4. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  5. Hadoop入门进阶步步高(六)-Hadoop1.x与Hadoop2的差别

    六.Hadoop1.x与Hadoop2的差别 1.变更介绍 Hadoop2相比較于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了非常大的提高,Ha ...

  6. [three.js] 地图不能解决重复的问题 Solving with Texture RepeatWrapping Fail Issue

    有些事情,如果你正在寻找侯,怎么也找不到. 有的东西,不经意间,到处: 我认为这是生活中常有的事. 然而,在互联网的浩瀚大海,这同样适用. 正常的一小会儿的积累, 投入少, 积累, 洋大海, 载起一帆 ...

  7. 自己主动机串标:Directed Acyclic Word Graph

    trie -- suffix tree -- suffix automa 有这么几个情况: 用户输入即时响应AJAX搜索框, 显示候选名单. 搜索引擎keyword统计数量. 后缀树(Suffix T ...

  8. FZU1669 Right-angled Triangle【毕达哥拉斯三元组】

    主题链接: pid=1669">http://acm.fzu.edu.cn/problem.php?pid=1669 题目大意: 求满足以a.b为直角边,c为斜边,而且满足a + b ...

  9. 将cocos2dx+lua创建的游戏port到windows phone

    在整个Port的过程中遇到的问题总结例如以下 1.一定要使用最新版本号的cocos2dx,原因大家看一下changelog就知道了,近期的cocos2dx版本号都是在修windows phone上的b ...

  10. 简介Customer Care Accelerator (CCA)

    几个月前,我们发表了CRM4.0的附属插件:Customer Care Accelerator (CCA). 年以来CCA已经存在,我们这些新手在CRM的世界里, Customer Care Fram ...