发布时间:2026-07-02阅读(0)
SCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上面所说的功能。
在理解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中的脏数据写入到数据文件中。
经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DG、streams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。

上面查SCN的方法,稍有延迟是因为执行命令的间隔,其实也是实时的了
SYS> select dbid,checkpoint_change# from v$database;

在控制文件中、数据文件头中。即checkpoint scn,表示该数据文件最近一次执行检查点操作时的SCN

SQL> select file#,name,checkpoint_change#,to_char(checkpoint_time,yyyy-mm-dd hh24:mi:ss) cptime from v$datafile;

SQL> select name,checkpoint_change#,to_char(checkpoint_time,yyyy-mm-dd hh24:mi:ss) cptime from v$datafile_header;

LAST_CHANGE#,如果数据库非正常关闭值为NULL。正常关闭是关闭时的SCN。
实例恢复就是在打开数据库时检查此参数确定是否需要恢复。
数据库OPEN时LAST_CHANGE#也为NULL,因为不确定SCN多少时关闭。
SQL> select name,last_change# from v$datafile;

SQL>select GROUP#,sequence#,STATUS,FIRST_CHANGE#,to_char(FIRST_TIME,yyyy/mm/dd:hh24:mi:ss) firsttime,NEXT_CHANGE#,to_char(NEXT_TIME,yyyy/mm/dd:hh24:mi:ss) nexttime from V$log;

篇幅有限,今天主要讲怎么SCN机制和怎么去查看SCN号,大家可以自己测试一下。
后面会分享更多关于DBA方面内容,感兴趣的朋友可以关注下!!

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图