Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1150787
  • 博文数量: 178
  • 博客积分: 2776
  • 博客等级: 少校
  • 技术积分: 2809
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-22 15:36
文章分类

全部博文(178)

文章存档

2014年(3)

2013年(66)

2012年(109)

分类: Oracle

2013-01-31 09:22:43

(一)事务过程

(接上文)我们再看下oracle事务中的数据变化是如何写入数据文件的:

1 事务开始;

2 buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;

3 事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

4 事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

5 当发生checkpointCKPT进程更新所有数据文件的文件头中的信息,DBWr进程则负责将Buffer Cache中的脏数据写入到数据文件中。

经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DGstreams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。

SCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。

总共有4SCN:系统检查点(System CheckpointSCN、数据文件检查点(Datafile CheckpointSCN、结束SCNStop SCN)、开始SCNStart SCN)。其中前面3SCN存在于控制文件中,最后一种则存在于数据文件的文件头中。

在控制文件中,System Checkpoint SCN是针对整个数据库全局的,因而只存在一个,而Datafile Checkpoint SCNStop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCNStop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL

在一个事务提交后(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo loglow SCN。以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN

当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCNNext SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中,而CKPT进程则将所有数据文件(无论redo log中的数据是否影响到该数据文件)的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN,同时将控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询)、每个数据文件对应的Datafile Checkpoint(通过视图v$datafile的字段checkpoint_change#可以查询)也更新为Next SCN。但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。

(二)心跳

Oracle中有一个事件叫Heartbeat,这个词在很多地方被提及,并且有着不同的含义(比如RAC),我们这里要讨论的是CKPTHeartbeat机制。

Oracle通过CKPT进程每3秒将Heartbeat写入控制文件,以减少故障时的恢复时间(这个我们后面再详细阐述)

我们可以通过如下方法验证这个过程。

1.首先在系统级启用10046时间跟踪

并重新启动数据库使之生效

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

 SQL*Plus: Release 9.2.0.4.0 - Production on Thu Jan 19 09:24:04 2006

 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

 Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - Production

 SQL> alter system set event='10046 trace name context forever,level 12' scope=spfile;

 System altered.

 SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.

 SQL> startupORACLE instance started.

 Total System Global Area 114365800 bytesFixed Size                   451944 bytesVariable Size              50331648 bytesDatabase Buffers           62914560 bytesRedo Buffers                 667648 bytesDatabase mounted.Database opened.SQL> exitDisconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 -

 ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - Production

 2.检查bdump目录下生成的跟踪文件

目录在$ORACLE_HOME/admin/$ORACLE_SID/bdump目录下,每个后台进程都会生成一个跟踪文件。

[oracle@jumper bdump]$ ls20050424_alert_conner.log conner_arc0_2569.trc

 conner_dbw0_2559.trc conner_reco_2567.trcalert_conner.log           conner_arc1_2571.trc

 conner_lgwr_2561.trc conner_smon_2565.trca.sql                      conner_ckpt_2563.trc

 conner_pmon_2557.trc oracle 11g

阅读(2846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~