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中的脏数据写入到数据文件中。
阅读(850) | 评论(0) | 转发(0) |