一、SQL2000的三种“故障还原模型”

在数据库属性的“选项”页,“故障还原模型”栏,共有三项选择:简单、完全、大容量日志记录。它们的根本差别在于SQL2000对数据库日志的维护方式不同。下面逐个讲述:

1、“完全”模型

我们都想象得出,如果需要实现“时点还原”,则SQL2000必须将所有的事务记录无一遗漏地保存下来,成为一条不中断的链。在日志文件中,每一条事务记录都被编了号(称“LSN”),号码是连续的。

在“完全”模型下,SQL2000对事务日志进行最严格、最彻底的管理。中心原理就是:如果你不备份事务日志,则日志文件将永远不会自行删除掉任何历史事务记录(结果将是文件无限增长)。

当你备份日志文件(即“BACKUP LOG”)时,SQL2000会记下哪些LSN已经备份好了,下次再备份日志时,这些LSN不会重复出现在下一个事务日志备份集。而且,每次进行日志备份时,除非你指明“不要删除事务日志中不活动的条目”,则SQL2000一旦觉得时机合适,都会随时删除掉没有用了的历史记录(称为“截断事务日志”)。

可见,及时地进行日志文件备份是很有必要的,不但是数据安全的需要,也是防止日志文件无限增长(导致浪费磁盘空间、降低系统性能)的需要。

如果先对数据库进行一次“完全备份”(即“打底备份”),然后,再连续对日志文件进行备份,所得的一连串有序的“日志文件备份集”将构成一条完整的“日志链”。只要取来“打底备份集”,结合这条“日志链”,我们就可以将数据库复原至日志链中任一时间点的状态。做到这点,作为DBA可以松一大口气了。

再强调一下:

①  在“完全”模型下,只有“事务日志备份”才会导致日志文件被截断,“数据库完全备份”或“数据库差异备份”并不会截断日志。

②  一条日志链中,如果你不小心丢失了中间一个日志备份集,则整条链就废了(或者至少,从丢失处起后面的备份集废了),你必须重新“打底”起过头。所以,通常应连续追加入同一媒体集,不要每次备份生成一个文件,零散文件是不好管理的(严格来说,这是个人喜好问题)。

2、“简单”模型

如果你为数据库选择了“简单”恢复模型,则SQL2000在记录事务日志时,对于日志中的“非活动部分”将随时截断(使之变为“可用空间”)。截断日志时,日志文件大小并不改变(除非你收缩数据库)。这里所说的“随时截断”是SQL2000自己抓主意的,并不需要通知你。

在“简单”模型下,日志的非活动部分随时被截断。这种模式的优点是“即使你不管理日志文件,它也不会增长得太大,不会占用太多硬盘”,缺点是“无法维护日志链”(原因是它里面的记录无连续保持性)。

值得注意的一点:即使你将恢复模型设为“完全”,但如果该数据库从未进行过“完全备份”,则SQL2000也像“简单”模型那样维护它的日志。原因:你都未作“打底”备份,留那么多日志记录给你也是白废。

3、大容量日志记录(也称为“批日志”)

“批日志”模型是对“完全”模型的一个补充,在某些特殊的情况下,使用“批日志”模型,能够提高SQL2000的性能(即“速度”),但它并不是必须的,即使永远不用“批日志”模型,也能工作得很好。

SQL2000向表中插入数据时,通常每次只插入一行,而且总是先登记日志记录,然后插入。但是,SQL2000也提供了“批插入”语句,即是:一个语句就向表中插入成千上万行(如:INSERT…SELECT语句),这种操作称为“批操作”。批操作时,SQL2000怎样进行日志记录呢?在“完全”模型下,它对每一行插入都作记录,其结果是日志量会很大;在“批日志”模型下,它只简单地标记一下哪些数据区域被“批操作”影响了(这张记录表称为“位映射表”),而并不将这些数据抄写入日志文件中,这样,日志量就大大减少。

在“批日志”模型下备份日志时,SQL2000不但要将日志文件内容写入备份集,特殊之处在于,它还需要按“位映射表”将当前数据库中的内容复制入日志备份集中:凡是自上一次日志备份以来,被“批操作”影响了的“数据区域”,都要原样抄入。要不然,当需要还原时,靠什么来还原数据呢?(自己想通)。

明白了上述“批日志”的本质,我们就能理解以下现象:在“批日志”模型下,假设有一个批操作(向表中一次过插入10000行),在进行到中途(已经插入了4800行)时,硬盘损坏,数据文件没有了。这时,我们利用日志文件无法复原回到“已插入4800行”的状态。原因很简单:日志中没有插入的数据。

有鉴于此,我们应该怎样对待批操作呢?一是不要改为“批日志”模型,保留“完全”模型来运作,慢就慢些(因为要记录大量日志),咬紧牙关做。二是临时改为“批日志”模型,具体步骤如下:

①  在开始“批操作”(例如,大量导入基础资料)前,让所有其他用户退出连接;

②  进行一次日志备份(为方便说明,所得日志备份集称为“日志备份集A”);

③  将“故障还原模型”改为“批日志”模型;

④  开始执行“批操作”。

⑤  若一切顺利(中间磁盘没有坏),则完成批操作后,即时改回“完全”模型,再进行一次日志备份。

⑥  如果第④步中,批操作进行了一半,磁盘坏了,则利用“日志备份集A”复原,使数据库完全回复到批操作开始前的状态,然后,再重新开始“批操作”。

无论如何,批操作结束后,千万别忘记撤换回“完全”模型。

其实,在我看来,无论你是否打算临时改用“批日志”模型,在“大规模导入数据”这种操作前,进行一次日志备份都是很有必要的,至少,有机会回头。

<来自转贴 ^_^>

SQL2000的三种“故障还原模型”的更多相关文章

  1. EF三种数据库操作模型比较

    https://blog.csdn.net/xiongmeiqin/article/details/80196089 EF 中 Code First 的数据迁移以及创建视图 写在前面: EF 中 Co ...

  2. IO复用、多进程和多线程三种并发编程模型

    I/O复用模型 I/O复用原理:让应用程序可以同时对多个I/O端口进行监控以判断其上的操作是否可以进行,达到时间复用的目的.在书上看到一个例子来解释I/O的原理,我觉得很形象,如果用监控来自10根不同 ...

  3. Netty中的三种Reactor(反应堆)

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  4. java:数据结构(四)二叉查找树以及树的三种遍历

    @TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...

  5. SDN三种模型解析

    数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...

  6. Javascript事件模型系列(一)事件及事件的三种模型

    一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...

  7. C++二级指针第三种内存模型

    #include "stdio.h" #include "stdlib.h" #include "string.h" void main() ...

  8. ESPlatform 支持的三种群集模型 —— ESFramework通信框架 4.0 进阶(09)

    对于最多几千人同时在线的通信应用,通常使用单台服务器就可以支撑.但是,当同时在线的用户数达到几万.几十万.甚至百万的时候,我们就需要很多的服务器来分担负载.但是,依据什么规则和结构来组织这些服务器,并 ...

  9. 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)

    html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距 ...

随机推荐

  1. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

  2. Unity5 GI与PBS渲染从用法到着色代码

    http://www.cnblogs.com/zhouxin/p/5168632.html 本文主要介绍Untiy5以后的GI,PBS,以及光源探头,反射探头的用法以及在着色器代码中如何发挥作用,GI ...

  3. 前端AJAX传递数组给Springmvc接收处理

    前端传递数组后端(Spring)来接收并处理: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  4. #pragma once与 #ifndef的区别

      为了避免同一个文件被include多次 1   #ifndef方式2   #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别.   ...

  5. cxf笔记记录

    一.Web Service框架介绍: 1. WebService框架的作用: -- WebService只是一种思想,不是一个具体的框架. -- 它也是javaEE的规范. -- 它可以跨平台(操作平 ...

  6. display:inline 和display:inline-block和display:block的区别

    之前讲过块级元素使用display:block 行内元素使用display:inline 那么今天我们就来区分一下display:inline,display:inline-block和display ...

  7. class && struct

    http://blog.csdn.net/yuliu0552/article/details/6717915 struct可以包含成员函数,可以继承,可以实现多态. struct为数据结构,class ...

  8. iis 301重定向

    把www.a.com重定向到www.b.com 只需在www.a.com上面右键属性---主目录,重定向到url,下面填上www.b.com,再把资源永久重定向勾选上即可. 注意,如果你需要把域名后面 ...

  9. 【转载】 ionic 的 下拉刷新 与 上拉加载

    这篇文章是讲解 Ioinc中怎么实现 下拉刷新和上拉加载的.也是我们日常做项目是必不可少的功能.有兴趣的小伙伴可以来学习一下. 更多关于 IONIC 的资源: http://www.aliyue.ne ...

  10. 点击空白处隐藏div-阻止事件冒泡

    $(" body").click(function(){ $("#div").hide(); }); $("button").click(f ...