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日志并进行多维度分析。
相关文章
|
9月前
|
存储 SQL 关系型数据库
binlog,undolog,redolog
binlog,undolog,redolog
113 3
|
AliSQL 关系型数据库 MySQL
Binlog In Redo
Introduce the feature which persists binlog into redo on RDS-8.0
419 0
Binlog In Redo
|
关系型数据库 数据库 Oracle
|
SQL Oracle 关系型数据库
|
数据库
[20161019]数据文件offline后恢复到那个scn
[20161019]数据文件offline后恢复到那个scn号.txt --前一天别人问的问题,如果数据文件offline时,online要恢复,一般恢复到scn是多少,是offline时的scn吗? --总不见得如果长时间offline,要应用许多归档日志吧,通过测试说明问题: 1.
843 0
|
SQL 机器学习/深度学习
常见dml、ddl语句使用nologging选项所生成的redo和undo大小比较
说明:反映undo、redo占用量的统计指标是: undo change vector size redo size   DDL/DML Operations ...
1223 0
|
Oracle 关系型数据库 索引
smon_scn_time ORA-00600 ktspfupdst-1
处理流程如下: 查看数据库日志报错: ORA-00600: internal error code, arguments: [ktspfupdst-1], [], [], [], [], [], [], [], [], [], [], [] Incid...
1130 0