Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106389
  • 博文数量: 38
  • 博客积分: 506
  • 博客等级: 下士
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-03 10:46
文章分类
文章存档

2014年(6)

2013年(10)

2012年(22)

我的朋友
scn

分类: Oracle

2012-10-31 09:49:36

select file#,checkpoint_change# from v$datafile;
select LAST_CHANGE# from v$datafile; stop SCN 查询 通常为NULl 记录在控制文件中
 
select  CHECKPOINT_CHANGE# from v$datafile_header;数据文件头start scn
 
select CHECKPOINT_CHANGE# from v$database; 系统检查点SCN
 
online redo log日志切换或者system checkpoint:
select recid,sequence#,first_change#,next_change# from v$log_history;

当日志切换或发生checkpoint时,从Low SCN到Next 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都不会被更新。
 
SCN与时间戳的转换:
SCN_TO_TIMESTAMP(SCN_number) 将SCN转换成时间戳。
TIMESTAMP_TO_SCN(timestamp) 将时间戳转换成SCN。
下面就举几个例子来说明:
将SCN转换成时间戳 SELECT SCN_TO_TIMESTAMP(21660534) timestamp FROM DUAL;
TIMESTAMP
---------------------------------------------------------------------------
20-3月 -12 10.38.32.000000000 上午 
 
将时间戳转换成SCN SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('20-3月-12 10.38.32.000000000','DD-Mon-RR HH:MI:SS.FF A.M.')) SCN FROM DUAL;
SCN
--------------
21660533
很明显的能看到同样的时间戳,转换出来的SCN就是不一样,其根本原因就是粒度问题了。
 
oracle事务中的数据变化是如何写入数据文件的:
1、事务开始;
2、在buffer cache中找到需要的数据块,否则,从数据文件中载入buffer cache中;
3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;
4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;
5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。
阅读(841) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~