你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
在SQL Server中,除了系统数据库外,你创建的每一个数据库都有三种可供选择的恢复模型: Simple(简单), full(完整), bulk-logged(批量日志)。 下面这条语句可以显示出所有在线数据库的恢复模型:
SELECT name, (SELECT DATABASEPROPERTYEX(name, 'RECOVERY')) RecoveryModel FROM master..sysdatabases ORDER BY name
SQL Server 2005及以上版本也可以使用下面这条语句来查看:
SELECT name, recovery_model_desc FROM master.sys.databases ORDER BY name
如果想改变数据库的恢复模型,可以使用下面SQL语句:
简单恢复模型:ALTER DATABASE AdventureWorks SET RECOVERY SIMPLE
完整恢复模型:ALTER DATABASE AdventureWorks SET RECOVERY FULL
批量日志恢复模型:ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED
在实际情况中,你应该选择使用哪种恢复模型呢?答案在于你能承受丢失多少数据。让我们用下面这些图表来说明这三种恢复模型之间的不同。下面这张图是一个数据库分别在9点和11点进行了一次完整备份。

1.简单恢复模型
假设硬件在10:45分时坏了。 如果数据库使用的是简单模型的话,那你将要丢失105分钟的数据。因为你可以恢复的最近的时间点是9点,9点之后的数据将全部丢失。当然你可以使用差异备份来分段运行,如下图:

像这样使用差异性备份的话,你将丢失45分钟的数据。现在,假设用户在9:50删除了一张很重要的表,你能恢复删除点之前的数据吗?答案当然是
No。因为差异性备份仅仅包含数据页的修改,它不能用于恢复一个指定的时间点。你不得不把数据库恢复到9点的状态,然后重做后面49分钟的事情。
2.完整恢复模型
假如在9点和11点之间没有进行事务日志的备份,那么你将面临和使用简单恢复模型一样的情况。另外,事务日志文件会很大,因为SQL Server不会删除已经提交和已经CheckPoint的事务,直到它们被备份。
假设每30分钟备份一次事务日志:
假如硬件在10:45分时坏了,那你只会丢失15分钟的数据。你可以使用9点的完整备份及直到10:30的事务日志来恢复。假如9:50分删除了重
要数据怎么办呢?没关系,你可以使用在10点备份的事务日志,把数据库恢复到9:49分的状态。
因为你恢复时无法直接跳过9:50那次误删除的操作日志而恢复9:50之后的数据, 所以你还必须重做误删除之后的操作。不过,这已经是不错的选择了。
注意:市场上有一些工具,可以使用事务日志来恢复用户误操作而丢失的数据,就是利用了上述原理
3.批量日志恢复模型
批量日志恢复模型被定义成一种最小化事务日志的完整恢复模型。例如select into就是一种最小化事务日志,假设这种事务发生在9:40分
这个事务将被最小化的记录下来,这就意味着SQL
Server仅仅记录由于这个事务而产生的数据页的变化,它不记录每一条插入到数据表中的数据。假如9:50时一个重要的表数据被删除了,那意味着什么
呢?意味着你不能把数据库再恢复到9:49分的状态了,因为事务日志在10点时被备份并且不能恢复到一个指定的时间点上。你只能把数据库恢复到9:30分
的状态。你要记住,无论在什么时候,只要事务日志备份包含一个或多个最小化日志事务,那你就不能再把备份还原到一个指定的时间点了。

既然如此,那人们为什么还要使用批量日志恢复模型呢?一个最主要的原因就是性能。让我们以select
into以例,从一个结果集来创建一张大表。假如你使用完整备份模型,那这张表中的每一条插入的数据都被记录下来,事务日志会消耗很多磁盘空间。假如你使
用批量日志恢复模型,那么仅仅会记录数据页的修改细节以达到最好的性能。就像我们刚才描述的那样,使用事务日志的好处就是可以恢复到某一个指定的恢复点,
但是会大大影响性能。
下面的几种操作都会最小化日志操作:
·批量导入操作(例如:INSERT ... SELECT * FROM OPENROWSET(BULK...), and BULK INSERT)
·select into 操作
·使用update来更新部分的大数据值数据类型。写入语句是插入或是追加数据,注意当被更新的数据存在时最小化日志不会被记录
·假如数据库恢复模型被设置为批量恢复或是简单恢复,那么一些索引的DDL操作会产生最小化日志,无论这个操作是在线还是离线被执行
·删除索引新建堆时
注意:当一个数据库的数据文件不可用时(也许是硬件坏了),假如媒介依旧在线可用,那么你依然可以备份事务日志文件。但是你需要确定backup
log命令一定要加上no_truncate选项。这样你就可以备份硬件毁坏前的事务日志了,这种方法常用来备份事务日志结尾。然则,假如你的数据库使用批量日志恢复模型且事务日志包括最小化日志事务,那么包括被修改过的页的数据文件一定要可用,假如数据文件不可用了,也就意味着你将不能备份事务日志结尾。这也是使用批量日志恢复模型另一个需要考虑的地方。
总之,简单恢复模型提供了数量最少的恢复选项和最简单的管理模型。完整恢复模型在恢复数据库时允许更复杂的情况存在。批量恢复模型简化了一些复杂性,从而得到了更好的性能。大家可以从Books Online中得到这三种恢复更细致的对比。
你真的会使用SQL Server的备份还原功能吗?之一:恢复模型的更多相关文章
- 你真的会使用SQL Server的备份还原功能吗?之二:主要备份类型
假设在下面几个时间段中,一个数据库积累插入了如下数据: 1.完整数据库备份 故名思意,完整数据库备份包括完整的数据库信息.它包括数据库的数据文件和备份结尾的部份活动事务日志. 完整备份基本语法如下: ...
- SQL server数据库备份还原问题备忘(亲测有效)
问题一:SQL server数据库备份还原方法 http://www.cnblogs.com/zgqys1980/archive/2012/07/04/2576382.html 问题二:无法执行 BA ...
- SQL Server数据库备份&还原
一.备份 1.登录数据库 2.找到要还原的数据库 右键-任务-备份-添加(路径只写一个,刚开始二个总是报错)-确定 二.还原数据库 这个之间报错了二次 1.报错1:备份集中的数据库与现有数据库“XXX ...
- SQL Server 数据库备份还原和数据恢复
认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据 ...
- SQL server 数据库备份还原Sql
/************ 一.数据库备份 ************/ --完整备份默认追加到现有的文件 backup database DBXS To disk='d:\backup\DBXS_fu ...
- 查询清除SQL Server数据库备份还原历史记录
曾经遇到过一个用户MSDB数据库非常大,让我帮忙查查是什么原因.使用sp_spaceused找出了所有表的数据大小,发现问题是SQL Server备份和还原历史表数据太大.用户经常会做日志备份,但是从 ...
- sql server 2000备份还原数据库
转载请注明出处:http://blog.csdn.net/neochan1108/article/details/79248017 备份: -- Create the backup device fo ...
- SQL Server 数据库备份还原常用SQL语句及注意
1.备份数据库 backup database db_name to disk='d:\db_name.bak' with format --通过使用with format可以做到覆盖任何现有的备份和 ...
- SQL Server数据库备份(本机)
基础的SQL Server数据库备份存储过程 /**************************************************************************** ...
随机推荐
- Windows Azure存储容器私有,公共容器,公共Blob的区别
当我们在Windows Azure中创建或编辑存储的容器时,需要选择访问类型,本文将描述一下这三个选项的区别. 1. 私有: 默认选项,顾名思义,用户不能通过URL匿名进行访问容器或容器内的任何Blo ...
- http协议要点
概念: HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组 ...
- github上所有项目的受欢迎程度排名,包括超大型项目
直接打开如下网址: https://github.com/search?l=Java&q=+stars%3A%3E0&ref=searchresults&type=Reposi ...
- 第二百零三天 how can I 坚持
空虚的有点害怕. 日复一日. 今天做了什么?下班看了个搞笑段子. 上班和刘松聊了一下午,东扯西扯的. 下班玩了两局dota. 想租车去出去玩玩,确实没有什么想去的地方了. 莫巧菲. 哎,未来好可怕啊. ...
- 转】MyEclipse10安装Log4E插件
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4231812.html 感谢! 一. Log4E插件下载 下载地址:http://log4e.jayefem.de/ ...
- ubuntu设置服务开机启动
在Ubuntu下用sysv-rc-conf命令,它是chkconfig的替代命令,而使用方法与chkconfig基本相同. 安装: sudo apt-get install sysv-rc-conf ...
- ESB 客户端调用 处理类
esb package com.isoftstone.synchronize.entrance; import java.io.File; import java.text.SimpleDateFor ...
- ado通用操作数据单元
DELPHI开发2层C/S数据库应用程序,许多人通过ADOQUERY或ADOTABLE直接操作数据库,其实这种方法虽然最为直接,但有其缺点:如果以后要将程序升级为3层C/S会非常困难.而通过像下面的通 ...
- Spring JTA应用JOTM & Atomikos II JOTM
上节建立了一个简单的Java Application以及所需要的数据库和数据表,本节将介绍JOTM在Spring中的配置. JOTM(Java Open Transaction Manager)是Ob ...
- 利用HTML5开发Android(6)---构建HTML5离线应用
需要提供一个cache manifest文件,理出所有需要在离线状态下使用的资源例如 Manifest代码 CACHE MANIFEST #这是注释 images/sound-icon.png ima ...