小弟初学,对修改数据到提交过程不很了解,特做笔记一篇,大哥们看看是否有纰漏

[复制链接]
查看11 | 回复1 | 2011-11-1 16:25:22 | 显示全部楼层 |阅读模式
当插入,删除,更新数据的时候,数据库内部都做了什么?
******个人认为,三种操作有着一定的区别********
相关定义:buffer cache通过几个链表进行内存管理,最为熟知的就是LRU list和dirty list(因为最新的版本的算法改变,也通常被称为checkpoint queue)
首先要了解,当一个用户连接到数据库的时候,oracle会自动分配给他一个server进程,用户也有属于自己PGA,当用户执行上述的三种操作的时候,则server进程会去哪去读取呢,我们必须确定的时候,server进程只能从buffer cache中访问数据,那server是如何访问的呢?如下-----
a:首先会看buffer cache中查找是否有需要的数据,这个根据LRU算法,从LRU list上移动该block,如果不存在就会读取数据文件,看b步骤
b.server从数据文件里读取数据之前,记住,是还没有读取了,会最先扫描LRU list去寻找free buffer,扫描过程中会把已经修改的buffer 移到checkpoint queue中,这些脏数据等待DBWN被写出到数据文件,那么checkpoint queue中的脏数据什么才被写呢,oracle要等他超过的阈值(队列超过25%满),还有种情况也会通知DBWN去写,就是这个server进程扫描LRU list到达一个阈值还没有找到足够的free buffer,会叫DBWN去写出脏数据,这时候服务进程会处于free busy wait状态,阈值大小是扫描LRU到40%,同时由于增量检查点的引入,DBWN会主动去扫描LRU LIST将发现的脏数据移动到checkpoint queue。
c.找到足够的free buffer之后,就会从数据文件中读取相应的数据到buffer cache中
**********************************************************************
我产生的疑问也得到的解释,那就是如果访问修改的数据量过大,buffer cache满了会如何,从上面的叙述等到了解释
**********************************************************************
d.当server在buffer cache中修改了数据,也会产生相应的redo entry到redo log buffer里,啥时候写入到redo日志里呢,我原来以为是commit才写,原来是三秒写次,commit写,满三分之一写次,一定要完全的写到了redo log里,DBWN才可以写数据吗,(这点很疑惑)脏数据不会立即就写到磁盘上,而是要满足刚刚的阈值:25%!

我突然想到一点:检查点发生是通知DBWN进程将此检查点(checkpoint scn)之前的脏数据从buffer cache写入磁盘,那上述的阈值怎么解释呢,难道也是一种触发方式?我一直认为是检查点发生才写,其实不然,大约有十几种操作触发DBWN写操作
DBWN写的时候要写的数据要和redo buffer里的RBA什么的对比,小的才给写,这就解释了我以往的问题lgwr和dnwn根据什么判断写的先后关系,就是靠这个RBA
***************************************************************************
回复

使用道具 举报

千问 | 2011-11-1 16:25:22 | 显示全部楼层
呵呵 应该是看过eygle的书
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行