SCN简介

Oracle系统改变号(SCN)详解
一. SCN定义
1.1Scn定义:
Scn:System change number,中文为,系统改变号,是oracle利用一个函数,基于时间计算出来的。既然是通过时间计算得来,那么通过反函数也可以将scn翻译成相应的时间点,使用scn的目的主要是将时间变为数字,比较起来更为方便。系统也就可以利用这个scn号来记录数据库的变化情况。
1.2查询当前系统的scn号以及通过scn号转换时间
1.2.1:查询当前scn号(系统全局scn)
讲道集1. select current_scn from v$database;
注释:通过这条语句查询出的scn号,其实是数据库运行时的一个时间记录,每次执行时,都会显示不同的scn号,从这一点也可以看出,scn是系统对于时间的一个记录。
2. select达州普光气田 _system_change_number from dual;
    注释:方法1和方法2的效果是一样的,当同时执行这两条语句时,可以得到相同的scn号。
1.2.2:查询当前系统scn和对应的时间
1.select _system_change_number,SCN_TO_TIMESTAMP(_system_change_number) from dual;
1.3.scn的类型
1.3.1checkpoint queue中的scn
在介绍checkpoint queuez中的scn之前,先来看一下检查点队列的经典SQL:
select
      CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA"
    ,CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA"
    ,CPODS
,CPODT
    ,CPHBT from x$kcccp;
以上SQL中查询出的字段含义解释如下:
    CPDRT:检查点队列的脏块个数
    Low RBA:就是整个检查点队列中最老的那个脏块的地址
    On disk RBA:就是当前使用的日志文件中的最后一个地址,也就是磁盘文件上的最后一个地址,当发生检查点时,oracle就会把Low RBA记录到数据文件中,如果某个时间数据库实例失败,那么重新启动恢复时,oracle就会从控制文件中到那个最新的Low RBAz作为起点,on disk RBA作为终点,把这段日志对应的脏块从日志文件中恢复出来。
    Cpodt:这个就是一个scn,它不是Low RBA被写入时的scn,而是on disk RBA被写入时的scn
1.3.2控制文件中的scn
控制文件中包含3中重要的scn,分别为系统检查点scn,保存的数据文件的检查点scn和数据文件结束的scn。数据文件的scn其实是数据文件的,但是会被保存在控制文件中,作用是为了校验数据文件的一致性和系统的状态。
至于控制文件本身的检查点的scn又叫系统检查点scn,该scn是全局范围的,当检查点进程ckpt启动时,oracle就把系统检查点scn保存到控制文件中,当发生文件级别的scn时,例如将某个表空间置为只读状态,不会更新检查点scn。
1.3.3数据文件中的scn
数据文件中的scn分为两种,分别为数据文件的检查点scn和数据文件结束scn。
1.3.3.1 数据文件检查点scn
当ckpt进程启动时,包括全局范围内的改动(例如日志切换)和文件级别的检查点(将表空间置为只读),就会更新数据文件的scn,并将这个scn写到控制文件中。
使用下面语句查看各数据文件的SCN:
select file#, name, checkpoint_change# from v$datafile;
checkpoint_change#:代表了SCN
1.3.3.2数据文件结束SCN
每个数据文件都有一个结束SCN,在数据的正常运行中,只要数据文件在线且可以读写,则这个数据文件的结束SCN为空,否则就是一个具体的SCN值,代表这个数据文件什么时候被结束只读状态。
使用下面的SQL可以查看数据文件的状态,数据文件的检查点SCN以及结束SCN
select a.file#
      ,a.name
      ,t.status as TS_STATUS
      ,a.checkpoint_change#
      ,last_change#
from v$datafile a, dba_data_files b, dba_tablespaces t
where a.file# = b.file_id
and b.tablespace_name = t.tablespace_name;
a. checkpoint_change#:数据文件检查点SCN
b. last_change#:结束检查点SCN
1.3.4日志文件SCN介绍
在redo log 里每条数据项都对应1个地址,而且每1条日志数据项都配置1个SCN,因为redo log file是严格按照日志的产生时间来记录日志的,所有SCN就是配备的时间信息了。
每个redo log文件中在文件的头都记录了两SCN,它们是first_scn和next_scn,first_scn就是日志文件第一条数据项的scn,相对的next_scn就是文件最后一条数据项的SCN,first_scn很容易理解,那么对于next_scn它不仅仅是当前日志文件的最后一个scn还是下一个日志文件中的first_scn,所以称它为next_scn。
所以first_scn和next_scn就代表了日志文件的记录范围,说明了这个日志文件组记录的是哪个时间段的日志信息。
可以使用下面的SQL查询出这两个SCN
select * from v$log;
1.3.5日志文件的SCN的意义
1.3.5.1日志文件的三种状态
1.Current:就是指当前正在使用的日志文件组,新产生的日志将会被写入这个日志文件组的文件。
2.Active:非当前写入的日志文件,但是在这个日志文件中还有没被写入到数据文件中的脏块,也就是说这个日志文件不能被覆盖重写,因为一旦被重写那么日志文件中记录的信息将丢失,在数据恢复时这部分数据有可能丢失。
3.Inactive:说明日志文件中没有脏块,可以重复使用。
那么在数据文件处于Active状态时,可以使用alter system checkpoint,或者alter system flush buffer_cache将脏块信息写入到数据文件中,那么此时可以将日志文件变为Inactive状态。
总结:系统检查点SCN实际上就是最早1个Active状态的日志组的first_scn,或者current状态的日志组的scn(当没有active状态的日志组时),当数据库实例崩溃时或者使用shutdown abort命令,oracle重启后会做实例恢复 ,就会从控制文件得出最新的系统检查点scn,然后根据这个scn获取第一个需要被恢复的日志数据,具体从哪个日志的那个数据项开始还要看被保存于控制文件的检查点队列的Low RBA.
1.3.5控制文件和数据文件SCN的意义
我们上面提到了,控制文件的系统检查点SCN是如何生成的,但是在上面还提到了其实控制文件还保存着数据文件的检查点SCN和结束SCN,这里会详细分析它们的关系及意义。
首先,上面说过,结束SCN是当文件结束在线状态或者结束读写状态时,就会生成结束SCN,那么正常情况下,除了手动更改数据文件的状态,只有关机这个动作,会生成数据文件的结束SCN(last_change#)。
而且关机时,oracle还会做一个动作,就是把每个dbf文件生成的结束SCN保存到控制文件中,那么下次启动时,oracle会检查控制文件,当然发现正常的dbf结束SCN,就认为自己上次关闭是正常关闭。
假如,数据库在运行中崩溃了,那么oracle就不会生成dbf文件结束scn和把他们写到控制文件,下次oracle启动自检时发现控制文件不存在数据文件的结束scn,那么oracle就认为上次关闭是非正常关闭,接下来就启动实例恢复,所以保存在控制文件中的数据文件结束SCNoracle启动时自动检查判断上次关闭是否正常关闭的标记。
还有,正常关闭下,所以数据文件的检查点SCN与系统检查点SCN时保持一致的,假如这
力度记号
时我们做一个动作,就是在数据库关闭状态时,使用较旧版本的1个数据文件去覆盖正常的数据文件,那么oracle在启动时发现这个数据文件的scn比控制文件中保存的scn旧,就会认为介质故障,就会要求启动介质恢复(需要归档日志),这时通过日志会将旧的dbf文件恢复成新的,所以行业内有一句话: 提升数据库文件的SCN!
oracle 自检时发现控制文件保存的系统检查点比数据文件的检查点scn还旧,就会认为控制文件发生故障,这时恢复数据库要使用下面命令:recovery database using backup controlfile或者其他的恢复语句。
1.3.6:fast_start_mttr_target
看这个参数的名字, 大概估算出这个参数跟启动速度有关没错, 这个参数参数就是用来设定数据库崩溃后, 实例恢复的期望速度. 这个参数的单位是秒, 假如我们把这个参数设为20, 那么oracle就会调整一些参数, 让实例回复的速度控制在20秒以内关键是调整什么啊, 我们知道实例恢复的本质是构造出丢失的脏buffer, 所以崩溃时脏buffer的数量直接影响着实例恢复的速度. 所以oracle就会调整脏buffer模糊聚类分析的数量, 怎样调整? 就是调整dbwr的写入频率啊.
附录
一.X$KCCCP详解
1. SQL> DESC X$KCCCP;
 异常数据挖掘名称                                                  是否为空? 类型
 ----------------------------------------------------- -------- --------------
 ADDR                                                          RAW(4)
天然气相对密度 INDX                                                          NUMBER  -----通常只需要关心indx=0
 INST_ID                                                        NUMBER
 CPTNO                                                          NUMBER
 CPSTA                                                          NUMBER
 CPFLG                                                          NUMBER
 CPDRT                                                  NUMBER ----select count(*) from v$bh where dirty='Y';检查点队列中的脏块数
 CPRDB                                                          NUMBER     
 CPLRBA_SEQ                                              NUMBER  ----最后一次增量检查点中LOW RBA中的序列号
 CPLRBA_BNO                                            NUMBER  ----最后一次增量检查点在LOW RBA中的块数
 CPLRBA_BOF                                          NUMBER  ----最后一次增量检查点在LOW RBA中的偏移量
 CPODR_SEQ                                    NUMBER  ----已写入日志文件的最后一个RBA的序列号=current日志$log.sequence#
CPODR_BNO                                            NUMBER  ----已写入日志文件最后一个RBA的块数
 CPODR_BOF                                                      NUMBER  ----已写入日志文件最后一个RBA的偏移量
 CPODS                                                          VARCHAR2(16)  ---- on disk rba scn
 CPODT                                                          VARCHAR2(20)  ---- on disk rba 的时间
 CPODT_I                                                        NUMBER
 CPHBT                                                          NUMBER             -----心跳,每三秒钟加一
 CPRLS                                                          VARCHAR2(16)
 CPRLC                                                          NUMBER
 CPMID                                                          NUMBER
 CPSDR_SEQ                                                      NUMBER 
 CPSDR_BNO                                                      NUMBER
 CPSDR_ADB                                                      NUMBE

本文发布于:2024-09-21 19:53:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/647065.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:文件   日志   数据文件   检查点   控制   状态
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议