Checkpoint

很多人都把checkpoint的概念给复杂化了,其实checkpoint这个数据库概念引入的真正意义就是用来减少在数据库恢复过程中所花的时间(instance recovery),那么checkpoint是又谁来做的呢?我们都知道数据库中有个CKPT进程,这个是个可选进程,但是真正执行检查点的任务并不是有ckpt来完成的,而是ckpt在更新控制文件和数据文件头的有关信息后,通知DBWn进程,产生一个检查点,在产生检查点的时候,DBWn进程会将buffer cache中的脏数据(当前online redo log对应的脏数据),写入我们的数据文件当中。那么这个时候如果数据库此时崩溃(比如我们做个shutdown abort),那么在进行实例恢复的时候就可以不需要当前online redo log的内容了,会很快就做完。因此ckpt进程只是个辅助进程,他的任务更多的是用来在系统做checkpoint的时候更新控制文件和数据文件头中的信息。其实在oracle 8i的时候呢,ckpt的任务一般都是由lgwr进程来完成,到了8i以后,随着CKPT进程的引入,lgwr的工作负担就减轻了很多(commit的速度加快了)

那么如何来产生检查点呢?

有三种方法,可以通过

1.alter system checkpoint

2.alter system switch logfile

3.DBWn进程写出脏块

SCN

在Oracle中理解为一个内部同步时钟,是系统改变号的缩写(system change number),在Oracle数据库中我们可以通过dbms_flashback包来查询当前系统的改变号:select dbms_flashback.get_system_change_number from dual;一般来讲SCN主要是用来标识数据库所做的所有改变,这个SCN的改变是只能前进,不能回退,除非我们打算重建库,数据库中的SCN永远不会归0,一般来说SCN的前进触发是由commit来进行的,除了这些据我观察每隔3秒种系统也都会刷新一次SCN.

需要注意的是:

1.CKPT一定是是在checkpoint发生的时候将数据库当前的SCN更新入数据库文件头和控制文件当中,同时DBWn进程将buffer cache中的脏数据块(dirty block)写到数据文件当中(这个脏数据也一定是当前online redo log保护的那一部分)。2.同时CKPT进程还会在控制文件当中记录(redo block address)RBA,这个地址用来标志恢复的时候需要从日志中的那个位置开始。

在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).

下面来聊一聊SCN号于数据库的启动

1.在数据库的启动过程中,当System Checkpoint SCN=Datafile Checkpoint SCN=Start SCN的时候,Oracle数据库是可以正常启动的,而不需要做任何的media recovery。而如果三者当中有一个不同的话,则需要做media recovery

2.那什么时候需要做instance recovery呢?其实在正常open数据库的时候,oracle会将记录在控制文件中的每一个数据文件头的End SCN都设置为#FFFFFF(NULL),那么如果数据库进行了正常关闭比如(shutdown or shutdown immediate)这个时候,系统会执行一个检查点,这个检查点会将控制文件中记录的各个数据文件头的End SCN更新为当前online数据文件的各个数据文件头的Start SCN,也就是End SCN=Start SCN,如果再次启动数据库的时候发现二者相等,则直接打开数据库,并再次将End SCN设置为#FFFFFF(NULL),那么如果数据库是异常关闭,那么checkpoint就不会执行,因此再次打开数据库的时候End SCN<>Start SCN这个时候就需要做实例恢复。

说了那么多更新SCN操作什么的,这个更新操作到底是由谁做的呢?其实刚才已经说过了,就是我们的CKPT进程,他不仅仅会更新SCN,而且还会通知DBWn做他的事情。

再说一下System Checkpoint SCN和Datafile Checkpoint SCN,这两个SCN都是记录在控制文件当中的。但是这两个SCN有什么作用呢?

logzgh有段论述,我自己的想了一下,还是学习一下他的结论:

1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。这三个SCN在表空间处于只读期间都将被冻结。

2.如果控制文件不是当前的控制文件(其实就是说,想比当前redo log的SCN来讲,控制文件已经过时了),则System checkpoint SCN会小于Start SCN(Start SCN是来自实际的数据文件头,有比较依据)。记录这些SCN号,可以区分控制文件是否是当前的控制文件。当有一个Start SCN(从当前各个在线数据文件中获得)号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。

当我们重建控制文件的时候,重建方式分两种(resetlogs 和 noresetlogs)

1.使用resetlogs选项时,System Checkpoint SCN为被归为0,而其中记录的各个数据文件的Datafile Checkpoint SCN则来自于Start SCN(也就是说可能会从冷备份的数据文件的数据文件头中获取)。根据上述的描述,此时需要采用using backup controlfile做recovery. 因此情况是 System Checkpoint SCN=0 < Start SCN = Datafile Checkpoint SCN

2.使用noresetlogs选项时,有一个前提就是:一定要有online redo log的存在。否则就要使用resetlogs选项。这个时候控制文件重建好时,其system checkpoint SCN=Datafile Checkpoint SCN=Lastest Checkpoint SCN in online redo log,我们可以看到Datafile Checkpoint SCN并没有从Start SCN中读取。而是读取了最新的日志文件中的SCN作为自己的数据。此时重建的控制文件在恢复中的作用跟最新的控制文件类似,System Checkpoint SCN(已经读取最新的redo log的checkpoint SCN信息)可能会>Start SCN (因为数据文件可能会从冷备份中恢复),恢复时就不需要加using backup controlfile子句了

关于backup controlfile的补充:backup controlfile只有备份时刻的archive log信息,并没有DB crash时刻的archive log信息,所以并不会自动应用online redo log,而是提示找不到序号为Lastest Archive log sequence + 1 的archive log,尽管你可以手动指定online redo log来实现完全恢复,但因为一旦使用了using backup controlfile子句,Oracle就视为不完全恢复,必须open resetlogs! 实际上,假如你有旧的控制文件又不想resetlogs,那很简单,使用旧的控制文件mount然后 backup to trace ,然后手工创建控制文件,使用 reuse database ... noresetlogs .这样就可以 recover database 自动恢复并open database 而不用 resetlogs 了

获取当前scn号scn1_Checkpoint和SCN的解析相关推荐

  1. 获取当前scn号scn1_Oracle 系统改变号SCN详解

    Scn : scn的英文全称就是 system change number, 中文直译过来就是系统改变号了. 1.SCN的定义 scn的英文全称就是 system change number, 中文直 ...

  2. 获取当前scn号scn1_深入理解SCN号

    在oracle中存在很多种scn,但是,只有如下几种是我们比较关注的. commit scn/cleanout scn database scn/on disk scn/thread scn/data ...

  3. 手动修改oracle scn号,SCN(系统改变号)

    1. scn: system change number 用以标识数据库在某个确切时刻提交的版本. 数据库的内部逻辑时钟. 每个数据库都有一个全局的SCN生成器. 它会随着外部变化的加快而加快变化,在 ...

  4. oracle技术之检查点及SCN号(一)

    一.CHECKPIONT分为三类: 1)局部CHECKPIONT: 单个实例执行数据库所有数据文件的一个CHECKPIONT操作,属于此实例的全部脏缓存区写入数据文件. 触发命令:SQL>alt ...

  5. mysql查询scn号_深入了解SCN-select * from Mibon;-51CTO博客

    SCN: System Change Number SCN是顺序递增的一个数字,在Oracle中用来标识数据库的每一次改动,及其先后顺序.SCN的最大值是0xffff.ffffffff. Oracle ...

  6. oracle 推进scn号

    oracle 10015 trace name adjust_scn level level_num一,在数据库无法打开,mount状态下通过10015事件推进scn alter session se ...

  7. oracle11g scn 补丁,Oracle11g中SCN与TimeStamp的相互转换

    Oracle11g中SCN与TimeStamp的相互转换 作为对于闪回操作(flashback)的一个增强,Oracle10g提供了函数对于SCN和时间戳进行相互转换. 获取系统的SCN号 selec ...

  8. oracle scn 作用,Oracle中scn讲解

    SCN System Change Numbers (SCNs)&System Commit Numbers(系统改变号&系统提交号) A system change number ( ...

  9. oracle transaction scn,关于Oracle DB SCN 生成率过高的 预警及处理建议

    关于Oracle DB SCN 生成率过高的 预警及处理建议 Oracle SCN简介: Oracle SCN(SystemChange Number),又名系统更改号,是Oracle数据库内部的一个 ...

最新文章

  1. Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
  2. REST接口GET方法获取文件保存到本地(C#)
  3. enable 华为交换机ntdp_关于华为交换机bpdu enable. ntdp enable. ndp enable解析
  4. 物理学与计算机相关参考文献,物理学专业论文参考文献
  5. “乘风破浪”的中国SaaS :风浪越大,机会越大?
  6. 数据库性能Quest Performance Analysis Overview
  7. 大学毕业4年-回顾和总结(6)-技术研发-重构之法
  8. Python中的极端梯度增强(XGBoost)集成
  9. 写给人类的机器学习 一、为什么机器学习重要
  10. 塑料模具加工的工艺流程在注塑行业
  11. AssertionError: 1 columns passed, passed data had 5 columns错误解决
  12. SCS【13】单细胞转录组之识别细胞对“基因集”的响应 (AUCell)
  13. 2018年11月25日ICPC焦作站参赛总结
  14. Adobe Illustrator自制苏大计科院院徽
  15. 小程序云开发登陆流程
  16. WORD文档无法编辑解决
  17. java爱听音乐音乐播放器
  18. mysql ndb 关闭_MySQL NDB Cluster环境启动与关闭
  19. 使用Inno Setup 6将exe文件打包成压缩包并设置压缩后自动生成桌面图标
  20. 天下英雄出我辈 一入江湖岁月催 《江湖行》

热门文章

  1. 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
  2. !!超级筹码理论总结
  3. SQL Server存储过程基本语法
  4. GIS概念的总结(一)什么是GIS
  5. android 标题栏不显示?
  6. Martin Fowler 微服务的原文翻译(转载)
  7. mysql5.7设置root密码无效_mysql 5.7 设置root密码方法
  8. python如何监听toast提示信息_python 怎样获取toast?
  9. python 格式化工具_Google的Python代码格式化工具YAPF详解
  10. unity打开一片黑_你的面膜上黑!名!单!了!吗!