SCN和Checkpoint

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: http://www.cnblogs.com/yifan268/archive/2008/07/15/1243418.html 转自   SCN和Checkpoint SCN :system change number。
http://www.cnblogs.com/yifan268/archive/2008/07/15/1243418.html 转自  
SCN和Checkpoint
SCN :system change number。作为数据库内部的逻辑时钟,用来标识数据库在某个确切时刻提交的版本,存在于控制文件、数据文件头、数据块、日志文件头、日志文件change vector。
数据文件头中包含该数据文件的checkpoint SCN。
Checkpoint :只是一个数据库事件,根本意义在于减少崩溃恢复时间(Crash Recovery)。
当Checkpoint 发生时,Oracle 会通知DBWR 进程,把之前的Dirty Data 从Buffer cache写入磁盘,写入完成后,CKPT 进程更新控制文件和数据文件头,记录检查点信息,表示变更。
那么如何来产生检查点呢?有三种方法,可以通过
1.alter system checkpoint
2.alter system switch logfile
3.DBWn进程写出脏块
每个checkpoint都记录一系列获得活跃的事务和记录最近的事务的日志的地址。一次checkpoint包含以下步骤:
l         把redo buffers的内容刷到redo log中。
l         在redo log file中留下一个checkpoint记录。
l         把database buffer cache的变更刷新到磁盘。
l         在checkpoint完成后,更新数据文件头和控制文件。
FAST_START_MTTR_TARGET 参数从9i开始引入,该参数定义数据库进行Crash 恢复的时间,单位是秒,取值范围在0~3600之间。
数据库当前的实例恢复时间可以通过v$instance_recovery, 可以看到当前数据库估计的平均恢复时间(MTTR):ESTIMATED_MTTR,TARGET_MTTR 表示期望的平均恢复时间。当ESTIMATED_MTTR > = TARGET_MTTR时,系统就会触发检查点,系统恢复信息后重新计算。
SELECT TARGET_MTTR,ESTIMATED_MTTR FROM v$instance_recovery;
LGWR 写log buffer à log files
1、 user commit a transaction
2、 redo log buffer 1/3 full
3、 changed record 接近 1M,不包括deleted or inserted records
4、 LGWR 空闲时间超过3秒
在Oracle数据库中和checkpoint相关的SCN总共有4个
1.System checkpoint SCN  (存在于控制文件)
在系统执行checkpoint后,Oracle会更新当前控制文件中的System checkpoint SCN。我们可以通过select checkpoint_change# from v$database来查看。
2.Datafile checkpoint SCN (存在于控制文件)
由于控制文件中记录了Oracle中各个数据库文件的位置和信息,其中当然也包括了Datafile checkpoint SCN,因此在执行checkpoint的时候,Oracle还会去更新控制文件中所记录的各个数据文件的datafile checkpoint SCN.
我们可以通过select checkpoint_change#  from v$datafile;来查看
3.Start SCN (存在于各个数据文件头)
在执行checkpoint时,Oracle会更新存放在各个实际的数据文件头的Start SCN(注意绝对不会是控制文件中),这个SCN存在的目的是用于检查数据库启动过程中是否需要做media recovery(介质恢复)。
我们可以通过select checkpoint_change# from v$datafile_header;
4.End SCN(存在于控制文件)
最后一类SCN,End SCN他也是记录在控制文件当中,每一个所记录的数据文件头都有一个对应的End SCN,这个End SCN一定是存在于控制文件当中。这个SCN存在的绝对意义主要是用来去验证数据库启动过程中是否需要做instance recovery。我们可以通过
select name,last_change# from v$datafile
那么其实在数据库正常运行的情况下,对于read/write的online 数据文件这个SCN号为#FFFFFF(NULL).
需要注意的是:
1.CKPT一定是是在checkpoint发生的时候将数据库当前的SCN更新入数据库文件头和控制文件当中,同时DBWn进程将buffer cache中的脏数据块(dirty block)写到数据文件当中(这个脏数据也一定是当前online redo log保护的那一部分)。
2.同时CKPT进程还会在控制文件当中记录(redo block address)RBA,这个地址用来标志恢复的时候需要从日志中的那个位置开始。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
索引
CheckPoint刷写脏页
CheckPoint刷写脏页
78 1
|
存储 SQL Oracle
|
AliSQL 关系型数据库 MySQL
Binlog In Redo
Introduce the feature which persists binlog into redo on RDS-8.0
405 0
Binlog In Redo
|
关系型数据库 数据库 Oracle
|
关系型数据库 数据库 测试技术
|
数据库
[20161019]数据文件offline后恢复到那个scn
[20161019]数据文件offline后恢复到那个scn号.txt --前一天别人问的问题,如果数据文件offline时,online要恢复,一般恢复到scn是多少,是offline时的scn吗? --总不见得如果长时间offline,要应用许多归档日志吧,通过测试说明问题: 1.
836 0
|
关系型数据库 数据库 算法
innodb checkpoint
checkpoint是为了解决: 缩短数据库恢复时间 缓冲池不够用时,将脏页刷新到磁盘 重做日志不可用时,刷新脏页 所以当数据库发生宕机时,数据库不需要重做所有的日志,因为checkpoint之前的页都已经刷新到磁盘了。
1025 0
|
SQL 监控 测试技术
大量redo生成的问题原因及改进
接着上次分享的关于数据库无法登录的原因http://blog.itpub.net/23718752/viewspace-1791089/ 其实最终还是因为在短期内生成了大量的redo,造成了频繁的日志切换,导致归档占用了大量的空间,最后无法登录,从这个层面来说,我们可以做一些工作来尽可能长时间的保留近期的归档,但是我们还可以换一个思路,那就是看看到底是什么操作生成了大量的redo,能不能试着减少redo的生成量。
901 0