Oracle中log buffer的内部管理机制概述

日志缓冲区的内部管理分为两部分,一部分是生成重做记录,另一部分就是重做记录写入联机日志文件。这两部分不是孤立的,没有关联的。在生成重做记录的过程中,可能会触发LGWR将重做记录写入联机日志文件。

我们先用一个例子来说明在日志缓冲区中的操作过程,并使用[file# , blk#]来表示某个数据块;file#表示文件号;blk#表示数据块号。

假设session 1发出更新语句:update redo_test set name='cdf' where id=1;

Oracle首先找出id=1所在的数据块(假设为[file#4,blk#120])放入buffer cache,然后找出一个可用的回滚段数据块(假设为[file#2,blk#19]),将旧值'abc'放入该块,同时生成重做记录。然后将'cdf'放入表的数据块,再生成重做记录。这时日志缓冲区的结构可以简单地表示为下面的形式(我们在前面描述日志缓冲区的内存结构时,知道重做记录中最重要的就下面列的这几列内容。同时,下面的一行就表示一个重做记录):

行号  事务id file#  block# row  column  value

1  T1  2       19  -  -   abc

2  T1  4       120  1  2   cdf

这时假设session 2发出其他更新语句:update t set c1=10 where c1=9;

同样的道理,Oracle找到该数据块(假设为[file#5,blk#200])放入buffer cache,并找到回滚段数据块(假设为[file#2,blk#30])存放旧值,生成重做记录,更新表的数据块,再次生成重做记录。这时日志缓冲区的结构类似如下形式:

行号  事务id file#  block# row  column  value

1  T1  2       19  -  -   abc

2  T1  4       120  1  2   cdf

3  T20  2       30  -  -   9

4  T20  5       200  20  1   10

这时,session 1又发出更新语句:update redo_test set name='xyz1' where id=2,并提交(commit)。同样的方式处理回滚段和数据块,并生成重做记录。假设这时生成日志缓冲区为:

行号  事务id file#  block# row  column  value

1  T1  2       19  -  -   abc

2  T1  4       120  1  2   cdf

3  T20  2       30  -  -   9

4  T20  5       200  20  1   10

5  T1  2       19  -  -   abc

6  T1  4       120  2  2   xyz1

7  T1  commit  SCN  timestamp

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

这时我们可以注意到,提交标记也被记录到了重做记录中。每次提交时,都会生成一个SCN号,SCN号越小,说明发生得越早,其所属的重做记录就越排在前面。一旦用户发出commit语句,系统就会触发LGWR进程。这时,LGWR进程会将上面所显示的所有重做记录都写入联机日志文件中。注意,其中也包括尚未提交的事务T20。

SCN号就是Oracle数据库内部的原子钟,可以认为是精确到秒后9位小数的时间信息。SCN号记录了数据库内部各个事件发生的先后顺序,比如DML、commit、DBWn写脏块等都会引起SCN号的增加。

在LGWR写这些重做记录的过程中,又有其他session 发出更新语句,并提交。这时的日志缓冲区假设如下所示:

行号  事务id file#  block# row  column  value

1  T1  2       19  -  -   abc

2  T1  4       120  1  2   cdf

3  T20  2       30  -  -   9

4  T20  5       200  20  1   10

5  T1  2       19  -  -   abc

6  T1  4       120  2  2   xyz1

7  T1  commit  SCN  timestamp

以上的重做日志正在由LGWR写入, 在LGWR写时生成以下的重做日志

-----------------------------------------------------

8  T20  2   39  -  -   289

9  T20  5   498  220  3   190

10  T9  2   90  -  -   hhh

11  T9  9   100  20  9   xxx

12  T9  commit   SCN  timestamp

13  T18  2   189  -  -   18

14  T18  10   29  300  10   20

15  T18  commit   SCN  timestamp

当LGWR写完第一批重做记录(第1到第7行)以后,就会立即开始写第二批重做记录(第8行到第15行)。注意,第二批重做记录中,存在两个commit,但LGWR不会分成两次来写,而是一次就将它们全部写入。当LGWR在写完第1到第7行的改动向量以后,这部分的日志缓冲区内存就被释放了,可以被新生成的重做记录所覆盖。

时间: 2024-12-02 19:38:57

Oracle中log buffer的内部管理机制概述的相关文章

联通技术人员单价1万倒卖信息 内部管理机制受疑

部分掌握公民个人信息的大公司,正逐渐成为信息泄露的主要源头.1月14日,重庆市公安局江北分局打掉了一个倒卖公民信息的团伙,该团伙联合重庆联通公司一名技术人员,利用联通机房的系统漏洞,提取系统中的短信内容,以每单高达1万元的价格出售. 重庆联通公司一名员工向< 每日经济新闻>记者透露,对于客户的个人信息,联通公司有一套保护机制,但其中也有缺陷.比如联通公司针对内部员工查询客户个人信息设置了相关权限,但在执行过程中,对于权限的应用则比较"灵活",存在越级查询的可能性. 有 业内

联通技术人员单价1万倒卖信息内部管理机制受疑

配图与文章内容无关 图片来源:资料图部分掌握公民个人信息的大公司,正逐渐成为信息泄露的主要源头.1月14日,重庆市公安局江北分局打掉了一个倒卖公民信息的团伙,该团伙联合重庆联通公司一名技术人员,利用联通机房的系统漏洞,提取系统中的短信内容,以每单高达1万元的价格出售.重庆联通公司一名员工向记者透露,对于客户的个人信息,联通公司有一套保护机制,但其中也有缺陷.比如联通公司针对内部员工查询客户个人信息设置了相关权限,但在执行过程中,对于权限的应用则比较"灵活",存在越级查询的可能性.有业内

Oracle中如何快速删除数据字典管理的表空间

oracle|数据 我的测试环境:Hp rp7410主机,Hp-unix11.11 OS,Oracle8.1.7.4的数据库,一个有90张表大约100G的测试表空间TBS_TEST. 问题的提出:Oracle中在使用drop tablespace <tablespace_name> including contents;删除数据字典管理的表空间时存在着很大的效率问题. 测试开始: 1.使用drop tablespace <tablespace_name> including con

oracle Buffer Cache的管理机制

1.LRU链表结构概述 在前面,我们已经知道了Oracle是如何在hash chain中搜索要找的数据块所对应的buffer header的过程,我们也知道如果在hash chain上没有找到所要的buffer header时,Oracle会发出I/O调用,到磁盘上的数据文件中获取数据块,并将该数据块的内容复制一份到buffer cache中的内存数据块里.这个时候,假如buffer cache是空的,比较好办,直接拿一个空的内存数据块来用即可.但是如果buffer cache中的内存数据块全都

Oracle中ASM Buffer Cache的作用和功能

10g在视图v$sga_dynamic_components中我们注意到多了一个component:ASM Buffer Cache,并且在instance_type=asm的实例中该参数有值,也就是说该参数是为asm实例所使用,它是用来做什么,在doc中搜了一下没找到,我猜测应该和db_cache_size的作用差不多,估计是用来cache disk header信息的. SQL> select component,current_size from v$sga_dynamic_compone

Oracle中通过DATA GUARD手工管理数据文件

一般情况下,会采用自动管理standby数据库文件文件的方式,但是有时候会采用手工方式管理,比如standby数据库使用裸设备的情况. 看一个例子: SQL> select name, open_mode, database_role, db_unique_name 2  from v$database; NAME                           OPEN_MODE  DATABASE_ROLE    DB_UNIQUE_NAME ----------------------

Linux进程管理机制概述

一 .进程的概念和分类 1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时间使用同一个linux系统:多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这

log buffer 深度解析+

原文整理自网络 5.3  深入Log Buffer   数据库在运行过程中,不可避免地要遇到各种能够导致数据库损坏的情况.比如突然断电.Oracle或者操作系统的程序bug导致数据库内部逻辑结构损坏.磁盘介质损坏等,都有可能造成数据库崩溃,从而导致数据丢失的现象发生. 为了避免,或者说为了修复这些状况所导致的数据丢失现象,Oracle引入了日志缓冲区和日志文件的概念.所谓日志,就是将数据库中所有改变数据块的操作,都原原本本地记录下来.这些改变数据块的操作不仅包括对数据表的DML命令或者引起数据字

Oracle中如何设置log buffer

对于日志缓冲区来说,设置过小,容易引起log buffer space等待事件.但也不是说设置得越大就越好的,设置过大,由于LGWR进程会不断启动刷新日志缓冲区从而释放内存,所以可能会根本用不上多余的内存,从而浪费内存. 设置合适的日志缓冲区大小,目的是为了能够让LGWR进程合理地触发.理想情况下是,一方面,在LGWR进程向联机日志文件中写重做记录时,日志缓冲区中还是有剩余的可用空间以供其他进程所使用:另一方面,当LGWR进程完成时,日志缓冲区中的剩余可用空间不要很多,因为这时由LGWR所写入日