- 浏览: 1468435 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
深入理解数据库日志系统原理
一:事务系统
1. 事务的工作模型
事务必须满足原子性,所封装的操作或者全做或者全不做。
事务管理系统需要做两件事,1) 让日志系统产生日志,2) 保证多个事务并发执行,满足ACID 特性。
事务系统工作模型,见图1 。
如图,事务管理管理器控制查询处理器的执行、控制日志系统以及缓冲区。日志在缓冲区生成,日志管理器在一定的时候控制缓冲区的刷盘操作。当系统崩溃的时候,恢复管理器就被激活,检查日志并在必要时利用日志恢复数据。
2. 事务的原语操作
在事务系统的运行当中,有三个地址空间供元素存储:1) 磁盘空间、2) 缓冲区、3) 事务的局部地址空间。
一个简单的读、修改X 元素操作的流程如:事务到缓冲中读取元素X ,如果命中,则读取事务局部地址空间并返回,如果未命中,则先将相关页从磁 盘读入缓冲区。事务在它的局部地址空间中修改元素X ,然后写入缓冲区,再从缓冲区写入磁盘。当然缓冲区的数据也可能不是立即拷贝入磁盘的,这取决于具体的 缓冲区管理策略。
为了便于描述,我们描述了五个操作原语:
1) INPUT(X) :将包含数据库元素X 的磁盘块拷贝到内存缓冲区
2) READ(X,t) :将数据库元素X 拷贝到事务的局部变量t 。更准确地说,如果包含数据库元素X 的块不在内存缓冲区中,则首先执行INPUT(X) 。接着将X 的值赋给局部变量t 。
3) WRITE(X,t) :将局部变量t 的值拷贝到内存缓冲区中的数据库元素X 。更准确地说,如果包含数据库元素X 的块不在内存缓冲区中,则首先执行INPUT(X) 。将着将t 的值拷贝到缓冲区中的X 。
4) OUTPUT(X) :将包含X 的缓冲区拷贝到回磁盘。
3. 应用
假设银行系统数据库中有两个元素,元素A( 表示用户1 的余额,值为1000 ,单位:RMB) 与元素B( 表示用户2 的余额,值为500 ,单位:RMB) 。这时候用户1 需要向用户2 转帐50 元。相应的过程为:
A := A – 50;
B := B + 50;
执行之前,两个用户的总余额为1500(1000+500) ,两个操作执行成功之后总余额还是1500(950+550) 。处于一致性状态。
如果只有前一条执行成功,那总额只为1450(950+50) 。处于不一致状态。
为了避免这种不一致状态,我们需要将这两个操作封装成一个事务T 。
我们将这两个操作分解为原语操作。如下:
READ(A,t); t := t-50; WRITE(A,t);
READ(B,t); t := t+50; WRITE(B,t);
OUTPUT(A); OUTPUT(B) // 这两个OUTPUT 原语操作由缓冲区管理器发出。
表1 给出了这8 个原语操作的执行步骤,给出了每一步中A 和B 的内存值、磁盘拷贝的值以及事务T 地址空间中局部变量t 的值
表1 : 一个事务的步骤及其对内存和磁盘的影响
步骤 |
动作 |
t |
内存A |
内存B |
磁盘A |
磁盘B |
1 |
READ (A,t ) |
1000 |
1000 |
|
1000 |
500 |
2 |
t := t-50 |
950 |
1000 |
|
1000 |
500 |
3 |
WRITE(A,t) |
950 |
950 |
|
1000 |
500 |
4 |
READ (B,t ) |
500 |
950 |
500 |
1000 |
500 |
5 |
t := t+50 |
550 |
950 |
500 |
1000 |
500 |
6 |
WRITE(B,t) |
550 |
950 |
550 |
1000 |
500 |
7 |
OUTPUT (A ) |
550 |
950 |
550 |
950 |
500 |
8 |
OUTPUT (B ) |
550 |
950 |
550 |
950 |
550 |
在表1 中不难发现,只要所有的这些步骤都执行成功,数据库的一致性就能得到保持。如果在执行OUTPUT(A) 前系统发生了故障,那么磁盘 上存储的数据库不会受到任何影响,就好象事务T 从来没有发生过一样。但是如果故障在OUTPUT(A) 后而在OUTPUT(B) 前发生,那么数据就会处于 不一致状态( 从表中可以看出,磁盘中A 为950 ,B 为500) 。我们不能防止这种情况的发生,但可以安排当这些情况发生时对问题进行修复----- 或者A 为1000 、B 为为500 ,或者A 为950 ,B 为550 。
二:undo 日志
1. 概述
日志是日志记录的一个序列。在多事务的数据库系统中,每个事务有若干个操作步骤。每个日志记录记载有关某个事务已做的某些情况。几个事务的 行为可以是“ 交错的” ,因此可能是一个事务的某个步骤被执行,并且其效果被记录到日志中,接着执行另外一个事务的某个步骤并记入日志,接着可能接着做第一 事务的下一个步骤,也可能执行另外一个事务的某个步骤。依次类推。事务的交错执行使日志更复杂,因为仅在事务结束后记载事务的全过程是不够的。
如果系统崩溃,恢复管理器就被激活,检查日志以重建数据库的一致性状态。恢复时,有些事务的工作将会重做,它们写到数据库的新值会重写一次。而另外一些事务的工作将被撤消,数据库被恢复,将仿佛这些事务从来没执行过一样。
Undo 日志是日志类型的一种,这类日志仅仅进行第二类修复。对于要被撤消的事务,因为不能肯定它对数据库的修改是否已经写到磁盘中,所以对于该事务的所有更新都将被撤消,数据库恢复到事务发生以前的状态。
2. 日志记录
日志只允许以附加的方式写入数据。日志块最初在主存中创建,像数据块一样也由缓冲区管理,在确当的时刻,日志块会从缓冲区写入到磁盘。
关于undo 记录形式有四种:
1) : 这一记录表示事务T 开始
2) : 事务T 已经完成。
3) : 事务T 不能成功执行。
4) : 事务T 改变了数据库元素X 的值,元素X 原来的值为v 。
3.undo 日志规则
要想让undo 日志能使我们从系统故障中恢复,事务必须遵循两条规则。
规则1) 如果事务T 改变了数据库元素X ,那么形如的日志记录必须在X 的新值写到磁盘前写到磁盘
规则 2) 如果事务提交,则其COMMIT 日志记录必须在事务改变的所有数据库元素已写到磁盘后再写到磁盘,但应尽快。
简单概括,undo 日志系统顺序如下:
1) 指明所改变数据库元素的日志记录
2) 改变的数据库元素自身
3) COMMIT 日志记录。
4. 应用
对于前面所举的例子(A 转帐50 元给B 帐号) ,如果使用了undo 日志系统,则相关的工作流程如表2 如下。
表2 :undo 日志系统的工作原理
步骤 |
动作 |
t |
内存A |
内存B |
磁盘A |
磁盘B |
undo 日志 |
1 |
|
|
|
|
|
|
<START T> |
2 |
READ (A,t ) |
1000 |
1000 |
|
1000 |
500 |
|
3 |
t := t-50 |
950 |
1000 |
|
1000 |
500 |
|
4 |
WRITE(A,t) |
950 |
950 |
|
1000 |
500 |
<T, A, 1000> |
5 |
READ (B,t ) |
500 |
950 |
500 |
1000 |
500 |
|
6 |
t := t+50 |
550 |
950 |
500 |
1000 |
500 |
|
7 |
WRITE(B,t) |
550 |
950 |
550 |
1000 |
500 |
<T, B, 500> |
8 |
FLUSH LOG |
|
|
|
|
|
|
9 |
OUTPUT (A ) |
550 |
950 |
550 |
950 |
500 |
|
10 |
OUTPUT (B ) |
550 |
950 |
550 |
950 |
550 |
|
11 |
|
|
|
|
|
|
<COMMIT T> |
12 |
FLUSH LOG |
|
|
|
|
|
|
在表2 ,我们可以看到FLUSH LOG 这个命令。该命令的用于强制将还没有刷盘日志记录写到磁盘上。对于步骤8 执行之前,三个undo 记录(,,) 是存储在缓冲区中的( 这样描述是为将问题简单化) ,执行步骤8 之后,三条undo 记录便写入了磁盘日志文件。在步骤12 再次执行FLUSH LOG 命令时,只将未刷盘的日志记录写入磁盘。
步骤9 、10 ,在前面已经描述过,是将数据库元素的修改从缓冲区写入到磁盘文件,因为WRITE 操作仅仅是将修改反应到缓冲区中( 这样描述也是为了将问题简单化) 。
关注步骤8 ,执行完步骤8 之后,将满足undo 的规则1( 如果事务T 改变了数据库元素X ,那么形如的日志记录必须在X 的新值写到磁盘前写到磁盘) 。在我们真正将数据库元素A 与B 的修改反应到磁盘前,我们已经将它们对应的与写入到磁盘日志文件。
关注步骤11 与步骤12 ,执行它们将满足undo 的规则2( 如果事务提交,则其COMMIT 日志记录必须在事务改变的所有数据库元素已写到磁盘后再写到磁盘,但应尽快) 。我们已经将数据库元素A 与B 的修改反应到磁盘上,接着可以写入来表示事务T 的成功执行,但是该日志记录还在缓冲区中,所以我们在步骤12 执行FLUSH LOG 进行日志刷盘。
5. 使用undo 日志进行数据库的恢复
现在假设系统故障发生了。有可能给定事务的某些数据库更新已经写到磁盘上,而同一事务的另外一些更新尚未到达磁盘。如果这样,事务的执行就不是原子的,数据库状态就可能不一致。这时候,我们就有必要使用日志将数据库恢复到一致的状态。
比如,在表2 中,如果故障发生在步骤9 之后、步骤10 之前。数据库的状态就是不一致的。
恢复管理的第一个任务就是将事务划分为已经提交事务和未提交事务。如果在日志中,根据undo 的规则2 ,事务
发表评论
-
mysql报Could not open file '/var/log/mysql/error.log' for error logging: Permissi
2018-12-04 12:35 10300报错的原因是我用转链接把/var/log/目录链接到了其它地方 ... -
postgresql advisory lock实现秒杀
2018-10-21 20:28 1050https://yq.aliyun.com/articles/ ... -
postgresql触发器old的使用
2018-08-30 20:07 2453在insert语句中old的值是null,如果访问null ... -
redis安装
2018-04-30 18:19 394下载最新的msi安装文件 https://github. ... -
monodb安装
2018-04-30 17:57 1275下载https://www.mongodb.com/down ... -
yii2 advanced安装
2017-12-23 01:37 672安装composer https://getcompos ... -
索引与优化like查询
2012-09-17 19:57 10831. like %keyword 索引失效,使用全表扫描 ... -
PostgreSQL中hash索引可能损坏
2010-12-30 22:05 1307http://postgresql.1045698.n5.na ... -
PostgreSQL配置优化
2010-12-30 14:45 3455PG的配置文件是数据库 目录下的postgresq ... -
存储程序的稳定性以及对索引的影响
2010-12-17 12:51 1005每个函数都有一个易失 ... -
php读取数据库二进制字段
2010-12-03 22:57 1609create table btest(id serial pr ... -
PgSQL数据库分区
2010-11-18 19:49 4643PgSQL数据库分区 :分区的意思就是把逻辑上的一个大表分割 ... -
PostgreSQL可以弥补MySQL数据库的哪些缺点
2010-11-14 15:19 3146转:http://blog.chinaunix.net/u2/ ... -
PostgreSQL帖子汇总
2010-11-12 22:34 1135http://bbs.chinaunix.net/viewth ... -
PostgreSQL与MySQL比较
2010-11-12 22:25 1973转:http://bbs.chinaunix.net/thre ... -
PostgreSQL 8.3.1 全文检索(Full Text Search)
2010-11-12 18:58 1824转自:http://www.blogjava.net/agun ... -
使用postgreSQL+bamboo搭建比lucene方便N倍的全文搜索
2010-11-12 18:50 3558所有用到到包有: cmake-2.6.4.tar.gz (编 ... -
PostgreSql的Bamboo全文索引扩展
2010-11-12 18:49 1176http://code.google.com/p/nlpbam ... -
PostgreSql查看索引
2010-11-11 17:59 9220select * from pg_indexes where ... -
PostgreSql日志记录执行计划
2010-11-11 00:35 1715postgresql.conf配置中加入如下行 sha ...
相关推荐
深入理解数据库日志系统原理
数据库系统原理是信息技术领域中的核心课程,尤其对于中级和高级软件考试来说,深入理解数据库系统的概念、设计与管理是至关重要的。本资料“中级高级软考!! PDF 数据库系统原理”旨在帮助考生全面掌握数据库系统的...
04735《数据库系统原理》历年真题集是一个重要的学习资源,它包含了自考试开始以来至2019年10月的所有试题,旨在帮助考生深入理解和掌握数据库系统的概念、设计、实现以及管理等方面的知识。这个压缩包中的文件很...
这份"数据库系统原理课后答案"涵盖了以上所有主题的详细解答,对于学习者深入理解数据库系统原理、提高解题能力大有裨益。通过深入研究这些答案,不仅可以巩固课堂所学,还能为实际项目中的数据库设计和管理打下坚实...
首先,我们要理解数据库系统的基本概念。数据库是一个有组织地存储数据的系统,它可以是关系型的,如MySQL、Oracle,或者是非关系型的,如MongoDB、Cassandra。在关系型数据库中,数据以表格的形式存在,每个表由行...
【04735自考数据库系统原理】是高等教育自学考试计算机科学与技术专业的一门重要课程,旨在帮助考生深入理解和掌握数据库系统的基础理论、设计方法以及应用技术。这门课程的内容涵盖了数据库系统的基本概念、数据...
《04735数据库系统原理》是一门重要的高等...通过深入理解和实践这些知识点,考生可以更好地应对《04735数据库系统原理》的考试。真题和答案的练习可以帮助考生了解考试的题型、难度和解题策略,进一步巩固所学知识。
这份《数据库系统原理与设计》第三版的课后答案PDF文件,可以帮助学生更有效地掌握上述各个章节的内容,通过解答习题,深化对数据库原理的理解,提升实际操作能力。对于准备数据库相关考试或项目开发的人来说,也是...
10. 高级主题:可能涉及触发器、存储过程、游标、事务管理、数据库复制等进阶功能,帮助用户深入理解和利用SQL Server 2000的强大功能。 这套PPT课件通过清晰的图表、实例演示和详细的解释,旨在帮助学习者掌握...
总之,"数据库系统原理答案"提供了全面的学习资源,有助于读者深入理解和掌握数据库的核心原理和实践技巧,无论是对于学术研究还是实际工作,都是一份宝贵的参考资料。通过详细阅读并实践其中的解答,可以有效提升在...
这门课程的核心是理解数据库的基本概念、数据模型、数据库管理系统(DBMS)的工作原理以及如何设计和优化数据库。提供的压缩包文件包含了从2007年10月至2019年4月的历年真题及其对应的答案,是学习者准备考试的重要...
《数据库管理系统原理与设计第3版》这本书深入探讨了这一主题,为读者提供了全面而深入的理论知识和实践技能。下面将详细阐述其中的关键知识点。 一、数据库系统基础 1. 数据模型:数据库的基础是数据模型,包括...
数据库系统原理是计算机科学中的核心课程,主要探讨...通过学习数据库系统原理,我们可以理解和掌握如何设计、实现和维护高效、可靠的数据库系统,这对于从事软件开发、数据分析、信息管理等相关工作的人来说至关重要。
这份"数据库系统原理PPT"涵盖了这一领域的关键概念和理论,是学习者深入理解数据库运作机制的重要参考资料。 1. **数据库定义与类型**:数据库(Database)是一个组织和存储数据的系统,它能提供数据的安全性、一致...
数据库系统原理是计算机科学中的核心课程之一,它深入探讨了数据的存储...通过深入学习,不仅可以理解数据库的工作原理,还能掌握实际操作和优化数据库的技巧,这对于任何需要处理大量数据的行业和职位都是必不可少的。
数据库系统原理是计算机科学中的重要课程,主要研究如何设计、实现和管理高效、可靠的数据库。在自考过程中,深入理解并掌握这部分知识至关重要。这份"自考 数据库系统原理 试题集"包含了从2007年至2013年的所有试题...
在这个压缩包中,我们预计会找到一系列关于数据库系统的PPT或PDF文档,可能包括课程讲义、案例分析以及练习题等内容,这些都将帮助我们全面理解数据库的概念和操作。 数据库是存储和管理数据的系统,它不仅包括数据...
这个课件集合来源于浙江大学陈岭教授的课程,对于深入理解和学习数据库系统有着极高的价值。通过这些PPT,我们可以掌握一系列关键概念和技术,包括但不限于: 1. 数据库概述:了解数据库的基本概念,如数据库、...
这份名为“数据库系统原理ppt.rar”的压缩包文件包含了一系列关于这个主题的PPT,是深入理解和掌握数据库系统原理的理想学习资料。下面,我们将详细探讨其中涉及的一些关键知识点。 1. **数据模型**:数据模型是...
数据库系统原理是计算机科学中的核心课程之一,它涵盖了数据存储、数据管理、查询处理和并发控制等关键概念。本资料集合包含"数据库系统...通过这些习题,学习者可以深入理解数据库系统的运作机制,提升实际操作能力。