rac 启动数据库-oracle 11g rac启动asm
概述
SCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、RAC节点间同步等各种功能中发挥着重要作用。 了解SCN的运行机制,可以帮助你更深入地理解上面提到的功能。
SCN机制
在了解SCN之前,我们先看看oracle事务中的数据变化是如何写入数据文件的:
1、交易开始;
2、在buffer cache中查找需要的数据块,如果没有找到,则从数据文件中加载到buffer cache中;
3、事务修改了buffer cache的数据块,数据被标记为“脏数据”写入log buffer;
4、事务提交,LGWR进程将日志缓冲区中的“脏数据”写入重做日志文件;
5、当checkpoint发生时,CKPT进程更新所有数据文件的文件头信息,DBWn进程负责将Buffer Cache中的脏数据写入数据文件。
经过以上五个步骤,最终将事务中的数据变化写入到数据文件中。 但是,一旦数据库在上述中间环节意外崩溃,重启时如何知道哪些数据写入了数据文件,哪些没有写入(同理,DG和streams中也有类似的问题:which data files redo log中有哪些?是上次同步时复制过的数据rac 启动数据库,哪些没有)? SCN机制可以完美解决上述问题。
SCN是一个数字,准确的说是一个只能增加不能减少的数字。 正是这种增量特性确保 Oracle 知道应该恢复什么以及应该复制什么。
一共有4个SCN:系统检查点(System Checkpoint)SCN、数据文件检查点(Datafile Checkpoint)SCN、结束SCN(Stop SCN)、开始SCN(Start SCN)。 其中,3种SCN存在于控制文件中,最后一种存在于数据文件的文件头中。
在控制文件中,System Checkpoint SCN对于整个数据库来说是全局的,所以只有一个,而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,所以一个数据文件对应控制文件SCN中的一个Datafile Checkpoint和停止 SCN。 数据库正常运行时,Stop SCN(可通过视图v$datafile的字段last_change#查询)为无限数或NULL。
一个事务提交后(上面第四步),redo log中会有一条redo记录,同时系统会为其提供最新的SCN(可以通过函数dbms_flashback知道当前最新的SCN .get_system_change_number),记录在这个记录中。 如果redo log切换时record被清空(切换时log满或发生checkpoint时,所有的change log都已经写入数据文件),则记录其SCN为redo log的low SCN。 以后再次清空日志前写入的redo record中的SCN就成为Next SCN。
当发生log switch或者checkpoint时(上面第五步),DBWn进程将Low SCN到Next SCN的所有redo records的数据写入数据文件,CKPT进程写入所有数据文件(不管redo是否日志中的数据影响数据文件)文件头上记录的Start SCN(可以通过视图v$datafile_header的字段checkpoint_change#查询)更新为Next SCN,控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询),每个数据文件对应的Datafile Checkpoint(可以通过视图v$datafile的字段checkpoint_change#查询)也更新到Next SCN。 但是,如果数据文件所在的表空间设置为只读rac 启动数据库,则数据文件的Start SCN和控制文件中的Datafile Checkpoint SCN将不会更新。
最后,SCN除了反映交易数据变化和保持同步外,还起到了系统“心跳”的作用——系统每3秒左右刷新一次系统SCN。
1、查询系统当前的SCN
SQL> 从 v$ 数据库中选择 current_scn;
SQL> 从 dual 中选择 dbms_flashback.get_system_change_number;
上面查看SCN的方法,因为执行命令的间隔,所以有一点延迟,其实是实时的
2.查询数据库全局-检查点SCN(控制文件)
SYS> 从 v$ 数据库中选择 dbid,checkpoint_change#;
3.查询当前数据文件checkpoint SCN
在控制文件中,在数据文件头中。 即checkpoint scn,表示上次执行checkpoint操作时数据文件的SCN
SQL> select file#,name,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') cptime from v$datafile;
4.查询数据文件头SCN(在控制文件中,数据文件头)
SQL> select name,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') cptime from v$datafile_header;
5.查询数据文件的结束SCN(在数据文件头,控制文件中)
LAST_CHANGE#,如果数据库异常关闭,则值为NULL。 正常关机是关机时的SCN。
实例恢复就是在打开数据库的时候检查这个参数来判断是否需要恢复。
LAST_CHANGE#在数据库OPEN的时候也是NULL,因为在SCN不确定的时候是关闭的。
SQL> 从 v$ 数据文件中选择名称,last_change#;
6.查询日志包含的SCN范围
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的内容会在后面分享,感兴趣的朋友可以关注一下! !