oracle 基础知识(三)--SCN
一,SCN的介绍
SCN(System Change Number),也就是通常所说的系统改变号或者系统提交号,是数据库中非常重要的一个数据结构。
SCN用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标识事务的SCN。SCN同时被作为Oracle数据库的内部时钟机制,可被看做逻辑时钟,每个数据库都有一个全局的SCN生成器。SCN在数据库中是唯一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN的值永远不会被重置为0.
二,SCN作用
01,一致性读
02,保证事务的唯一性
03,物理备份恢复机制重要的判断点
三,常见的SCN
01,控制文件中的SCN
1.1 数据库SCN
数据库SCN表示最近一次全量checkpoint操作时的SCN
1.2 数据文件SCN
通过 V$DATAFILE查询保存在控制文件中的数据文件SCN
数据文件头SCN
STOP SCN
数据库打开或异常关闭,该值为空或无穷大0xffffffffffffffff
1.3 CHECKPOINT PROGRESS RECORDS中的SCN
CHECKPOINT PROGRESS RECORDS中的on disk scn表示当前系统最新rba对应的scn,有ckpt进程每3秒更新一次。
02,数据文件头的SCN
creation_change#
数据文件创建时的SCN
checkpoint_change#
表示数据文件头当前的SCN
resetlogs_change#
表示数据库以resetlogs方式打开时的SCN,在dump的控制文件中也能看到Resetlogs scn
转换成十进制就是页面显示的SCN
change#
表示数据文件冻结时的SCN。在做数据文件在线热备时,常用begin backup命令将数据文件头冻结,表明chang#这个点开始对数据文件进行备份
操作以下:
03,数据块的SCN
数据块变化时的SCN
数据块事务槽中的SCN
数据块中数据行的SCN
04,日志文件头的SCN
FISRT_CHANGE#
表示该在线日子文件被重用时的SCN
NEXT_CHANGE#
表示该日志文件重用结束时的SCN
RESETLOGS_CHANGE#
表示数据库已RESETLOGS方式打开时的SCN。通常和数据文件头的RESETLOGS_CHANGE#相同
05,事务开始时的SCN
06 数据库的CURRENT SCN
07,操作是否刷新SCN号码
四,检查点与SCN
01、完全检查点
当完全检查点发生时,ckpt进程会触发DBwriter进程把所有脏块写入磁盘上。
02、增量检查点
当增量检查点发生时:
1、ckpt进程会把检查点队列的第一个被脏的数据块所对应的日志地址记录到控制文件。
2、当检查点队列连接的脏块太多以及系统的I/O不是很忙,这是会触发DBwriter将最早脏的数据块部分写入磁盘上来缩短检查点队列。
03、当Oracle正常关闭时会触发完全检查点
当Oracle在正常运行期间每隔3秒发生一次增量检查点。 每个数据块中都有两个日志地址:LRBA和HRBA
RBA:数据块日志地址
LRBA:数据块第一次被脏的日志地址
HRBA:数据块最近一次被脏的日志地址
Log writer进程每隔3秒会将log buffer cache里面的日志写到当前联机日志里(current redo log)。
on disk RBA:是current redo log里面的最后一条日志的地址(即current redo log 里面最新一条日志的地址)。
04、实例崩溃恢复过程(Oracle自动恢复):
找起点,确定终点,跑日志(前滚)
1、Oracle发现实例非正常关闭需要做实例恢复
2、Oracle在控制文件中通过LRBA地址找到日志的起点
3、Oracle从日志的起点开始跑,跑到redo log的最后一条日志
4、Oracle跑日志跑到终点时,保证所有已提交事物的脏块全部被构造出来,同时一些未提交事物的脏块也被构造出来,Oracle会自动将崩溃前为提交的事物进行回滚
注:实例恢复需要联机日志(不需要归档日志)
SCN知识点
1 ①数据库正常启动时,控制文件中系统SCN、文件SCN和数据文件中的起始SCN号应该是相 2 同的,结束SCN是空(可以理解为无穷大)。 3 ②数据库正常关闭时,用关闭的时间点SCN去更新控制文件中系统SCN、文件SCN、结束 4 SCN和数据文件中的起始SCN。 5 ③数据库非正常关闭时,控制文件中系统SCN、文件SCN和数据文件中起始SCN为崩溃时的 6 时间点的SCN,而控制文件中的结束SCN为空,下次启动时,Oracle检查到系统SCN、文件 7 SCN和起始SCN一样,唯独结束SCN为空,则认为需要做实例恢复。 8 ④数据库正常运行时,当发生脏块写入磁盘时,及redo log里面的active(日志所对应 9 的脏缓存区还没写入磁盘)变为inactive(日志所对应的脏缓存区已经写入磁盘),则ckpt会用redo log里最老的active的first SCN更新系统SCN、文件SCN和起始SCN。 10 ⑤当用旧的数据文件、控制文件替代新的,然后启动数据库,Oracle发现控制文件里面的系统SCN和current redo log的SCN低,则Oracle会通过跑日志,把旧的数据文件,控制文件跑成最新。
五,SCN恢复实例
01,创建表,并且插入数据
create table test1(a varchar2(10),b varchar2(10)); insert into t1 values('12345','67890');
02,查看事务
03,数据更改
update test1 set a='abcde',b='fghij'; commit;
04,数据恢复
关闭数据库
启动到mount
rman target /
RMAN> run{ set until scn 1491133;----这个SCN为刚刚查询的,也就是事故发生前 restore database; recover database; alter database open resetlogs; }
进入rman
05,验证
重新进入数据库查看即可