一、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. Gulp Babel AMD转换例子

    1.gulpfile.js var gulp = require('gulp'); const babel = require('gulp-babel'); gulp.task('default', ...

  2. (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...

  3. 最短路径——Floyd算法

    如何求一张图中任意两顶点之间的最短路径长度,这里写一种最简单的算法——Floyd算法: #include<stdio.h> #define inf 9999 int main() { ][ ...

  4. 读<jQuery 权威指南>[5]-插件

    一.说明 jQuery插件官网:http://plugins.jquery.com/ 使用插件时引用顺序:插件引用要位于主jquery库之后. 二.插件应用实例 演示插件jquery.validate ...

  5. PDF 补丁丁 0.4.2.1023 测试版发布:新增旋转页面功能

    新的测试版发布啦.此版本增加了旋转页面的功能. 在“PDF文档选项”对话框的“页面设置”选项卡中,可设置需要旋转的页面(输入页码范围),以及旋转角度. 此外,还修复了统一页面尺寸功能的小问题.

  6. Linux (Ubuntu) 下配置VPN服务器

    昨天网上找了下VPN的相关信息,居然各种撞墙,特别郁闷,自己不容易找到的东西,记录下VPN的配置信息 ubuntu 13.1下配置VPN  ,采用PPTP实现, 第一步.安装pptpd,没有安装包记得 ...

  7. QB资料学习.01

    1.多数据集的读取 A.取数SQL的配置,借用TStringList进行存储多个不同的取数SQL B.DBA取数:  DBA.ReadMultipleDataSet(TStringList) C.结果 ...

  8. iOS7程序内部如何打开评分页面

    测试发现项目在iOS7下 无法打开评价页面,但是iOS6是正常: 查了一下发现应该是iOS7 改变链接了,有个网友给出了以下的解决办法 把旧的链接改成 appString =[NSStringstri ...

  9. (转)iOS图片拉伸技巧

    ( 原文博客地址:  http://blog.csdn.net/q199109106q/article/details/8615661) 纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要 ...

  10. javascript之小积累-.-typeof与instanceof的区别

    1.typeof 是获取一个变量或表达式的类型,返回的值通常是string, number, boolean, object(null, 数组, 对象), function, undefined,可以 ...