SQL2000的三种“故障还原模型”
一、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的三种“故障还原模型”的更多相关文章
- EF三种数据库操作模型比较
https://blog.csdn.net/xiongmeiqin/article/details/80196089 EF 中 Code First 的数据迁移以及创建视图 写在前面: EF 中 Co ...
- IO复用、多进程和多线程三种并发编程模型
I/O复用模型 I/O复用原理:让应用程序可以同时对多个I/O端口进行监控以判断其上的操作是否可以进行,达到时间复用的目的.在书上看到一个例子来解释I/O的原理,我觉得很形象,如果用监控来自10根不同 ...
- Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- java:数据结构(四)二叉查找树以及树的三种遍历
@TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...
- SDN三种模型解析
数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...
- Javascript事件模型系列(一)事件及事件的三种模型
一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...
- C++二级指针第三种内存模型
#include "stdio.h" #include "stdlib.h" #include "string.h" void main() ...
- ESPlatform 支持的三种群集模型 —— ESFramework通信框架 4.0 进阶(09)
对于最多几千人同时在线的通信应用,通常使用单台服务器就可以支撑.但是,当同时在线的用户数达到几万.几十万.甚至百万的时候,我们就需要很多的服务器来分担负载.但是,依据什么规则和结构来组织这些服务器,并 ...
- 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)
html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距 ...
随机推荐
- telnet: connect to address xxxxxxx: No route to host
在要连接的服务上执行iptables -F
- 转<%%>、<%=%>、<%$%>、<%@%>的区别
1. 未定义的命名空间前缀“xsd” 上周在项目开发中遇到这样的一个问题,在一个页面用到了自定义的Picker控件,在IE6.7.8.9以及IE10兼容模式下都没有任何问题,但是一换到IE10时已选择 ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- HttpCache ETag与Last-Modified与Expires
Last-Modified 是检查一个资源最后修改时间.如果时间过期了则返回资源内容.如果没过期,返回304.当Last-Modified更新了,但是资源本质上没有更新,比如资源是A,Last-Mod ...
- vtune 错误
The Data Cannot be displayed,there is no viewpoint available for data 1. In a console, run your appl ...
- 从一个ISP移至另一个ISP而不改变IP的方案
某客户从一个ISP_A移到了另一个ISP_B.但是,其WEB服务器由于之前对外公布的是IP地址,且无DNS,因此,要求该服务器搬至ISP_B后,用户依然可以访问原来的IP地址,求方案. 假设:ISP_ ...
- .htaccess设置自定义出错页面
404错误可以这么写 ErrorDocument code error.php 如果是404错误,跳到文件error.php 其他常用错误页面写法(其中404错误有2种写法,上面一种,下面是通用错误定 ...
- 如何在Linux下使用Gitblit工具创建Git仓库服务
嗨!朋友,今天我们将学习如何在你的Linux服务器或者PC上安装Gitblit工具.首先,我们看看什么是Git,它的功能以及安装Gitblit的步骤.Git是分布式版本控制系统,它强调速度.数据一致性 ...
- redhat6.4上安装mysql
1.挂载操作系统介质 [root@server- ~]# mkdir -p /media/dvd [root@server- ~]# -20130130.0-Server-x86_64-DVD1.is ...
- php变量函数,回调函数
一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 { for($i=0;$i<$num;++$i) { if($n($i)) { e ...