SCN的简单介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 基础概念

网上也有很多人在讨论SCN,下面我把各种SCN一一做简单介绍,欢迎大家一起探讨。

1、SCN是什么?(system change number/system commit number)
2字节为Wrap(进位值)+4字节为Base(底值)
select current_scn,dbms_flashback.get_system_change_number,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),scn_to_timestamp(dbms_flashback.get_system_change_number) from v$database;

2、SCN的介绍
(1)控制文件序列号
该序列号是判断控制文件是否过“旧”的要素之一,在控制文件被更新(检查点信息更新、创建删除表空间等)之后就会增长。
select controlfile_sequence# from v$database; --当前控件文件记录的序列号
select hxfil as file#,FHCSQ from x$kcvfh; --当前数据文件头部中记录的控制文件序列号
当然Oracle不会只依赖控制文件序列号判断控制文件是否是“旧”的,还依赖控制文件检查点SCN号,序列号只是用来短路该判断,如果序列号校验没通过,就没必要校验控制文件检查点SCN号了。

(2)控制文件检查点SCN
该序SCN也是判断控制文件是否过“旧”的要素之一,控制文件检查点SCN必须大于或等于所有数据文件头部的检查点SCN号,否则,控制文件同样被认为是“旧”的,实例恢复无法启动
select controlfile_change# from v$database;
--完全检查点把SCN更新至数据文件头和控制文件中
--增量检查点仅把SCN号更新至控制文件中

(3)数据库检查点SCN
控制文件中保存的数据库检查点SCN号实际上在所有数据文件头部中最小的检查点SCN。它是数据文件状态的一个缩影,根据它的值与每个重做日志的高、低位SCN比较,Oracle可以确定恢复文件需要使用的第一个日志文件。

select checkpoint_change# from v$database;--这个值来自于v$datafile_header.checkpoint_change#的最小值

(4)数据文件检查点SCN:当一个检查点动作完成之后,Oracle就把每个数据文件的scn单独存放在控制文件中

select name,checkpoint_change# from v$datafile;

(5)数据文件终止SCN:每个数据文件的终止scn都存储在控制文件中

select name,last_change# from v$datafile;

(6)数据文件启动SCN:Oracle把这个检查点的scn存储在每个数据文件的文件头中

select name,checkpoint_change# from v$datafile_header;

(7)增量检查点信息SCN:每3秒由CKPT进程去更新控制文件中的low cache rba信息,也就是检查点的位置

col LRBA for a30
col OndiskRBA for a30
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "LRBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "OndiskRBA",CPODS from x$kcccp;

(8)在线日志文件低位SCN(FIRST_CHANGE#)和高位SCN(NEXT_CHANGE#)

 日志文件中的重做记录范围是由这两个SCN来表示的。
 select first_change#,next_change# from v$log; --v$log_history

(9)数据块中的SCN

(10)当begin backup命令发出后,相关数据文件的checkpoint scn被冻结(以及状态标志被改变)

3、SCN工作机制
(1)数据正常运行时:控制文件中的系统检查点scn、控制文件中的数据文件检查点scn和每个数据文件头中的启动scn都是相同的
(2)控制文件中的每个数据文件的终止scn都为无穷大FFFFFFFFFFFFFF
(3)正常关闭数据库的过程中,系统会执行一个检查点动,这时所有数据文件的终止scn都会设置成数据文件头中的那个启动scn的值
(4)在数据库重新启动的时,Oracle将执行两次检查

 a.看数据文件头中的ckpt计数器是否与对应控制文件中的ckpt计数器一致,若相等,进行第二次检查
 b.比较文件头中的启动scn和对应控制文件中的终止scn进行比较,如果终止scn等于启动scn,则不需要对那个文件进行恢复

(5)数据库打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为FFFFFFF,这表示数据文件已经打开并能够正常使用了
注:非正常关闭数据库时不进行检查点处理,终止scn仍然为无穷大。在下次启动期间,发现启动scn和终止scn不同,需要实例恢复。

4、SCN的增加
(1)只要数据库被修改,SCN就会+1,而不是一定要进行checkpoint,例如DML的发生即使没有提交也会使SCN+1
(2)如果一个DML导致产生事务,则会产生一个SCN
(3)Oracle 10g内部的SCN会默认不管有没有动作,每隔3s自动增加一次
(4)只有ckpt进程才会修改文件头中的checkpoint计数器和SCN,DBWR只会修改数据块,即ckpt通知dbwr写数据文件,写完之后ckpt更新控制文件和数据文件头

5、SCN相关命令及视图
alter system checkpoint;
alter system switch logfile
select checkpoint_change# from v$database
select name,checkpoint_change# from v$datafile
select name,checkpoint_change# from v$datafile_header
select * from v$log;

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
关系型数据库 数据库 Oracle
|
Oracle 关系型数据库 数据库
|
数据库
[20161019]数据文件offline后恢复到那个scn
[20161019]数据文件offline后恢复到那个scn号.txt --前一天别人问的问题,如果数据文件offline时,online要恢复,一般恢复到scn是多少,是offline时的scn吗? --总不见得如果长时间offline,要应用许多归档日志吧,通过测试说明问题: 1.
826 0
|
SQL Oracle 关系型数据库
[20160406] 恢复until scn NNN.txt
[20160406] 恢复until scn NNN.txt --昨天别人问的问题,如果使用rman恢复,restore database until scn NNN;是恢复到NNN,还是NNN-1.
838 0
|
SQL 监控 测试技术
大量redo生成的问题原因及改进
接着上次分享的关于数据库无法登录的原因http://blog.itpub.net/23718752/viewspace-1791089/ 其实最终还是因为在短期内生成了大量的redo,造成了频繁的日志切换,导致归档占用了大量的空间,最后无法登录,从这个层面来说,我们可以做一些工作来尽可能长时间的保留近期的归档,但是我们还可以换一个思路,那就是看看到底是什么操作生成了大量的redo,能不能试着减少redo的生成量。
892 0
|
Oracle 关系型数据库 Linux
[20150129]关于取scn号.txt
[20150129]关于取scn号.txt --SCN有称系统改变号或者系统提交号,在oracle占有重要的位置.可以讲scn无处不在. --取scn号一般使用查询dbms_flashback.
1033 0
|
Oracle 关系型数据库 索引
smon_scn_time ORA-00600 ktspfupdst-1
处理流程如下: 查看数据库日志报错: ORA-00600: internal error code, arguments: [ktspfupdst-1], [], [], [], [], [], [], [], [], [], [], [] Incid...
1104 0
|
移动开发
[20140612]确定每天产生的redo大小
[20140612]确定每天产生的redo大小.txt column h0 format 999 column h1 format 999 column h2 format 999 column h3 format 999 column ...
752 0