• day10_scn号


    -------------------SCN系统改变号---------------------
    (1)数据发生变化了,SCN值增加。为了保证数据是同步的,集群有2节点,都能改数据,第1节点改完了,SCN +1。第2节点同步数据,对比两个节点SCN号。
        比如:节点1的SCN是 101       
              节点2的SCN是 100【以大的为准,将节点1的数据同步到节点2】
              
    在oracle中也一样,每做一次改变,SCN号就会+1,或者你不做数据改变,它也会按时间增长,你数据库跑了1小时,时间发生变化了,库的SCN号也会变化。


    SCN的作用?
    你在启动时,是不是要自动恢复,你没有正常关机,第2次启动库时,它怎么知道你数据库的完整性有问题,它不可能扫描所有文件,不可能扫描所有文件下所有数据。
    如果你扫描所有文件,一个生产库至少100G,那你全扫描一下,得多长时间啊?那怎么办?
    它会看每个文件的SCN号,发果发现SCN号有不匹配,肯定丢数据的了,怎么办?

    例:

    控制文件中记录:                             非正常关机 

    数据文件的位置                          库中数据文件
         system SCN:10000             system SCN:9990
      数据文件1 SCN:10000
      数据文件N SCN:10000
      
    日志文件的位置


    当你再次重启库时,两边的同一个数据文件的SCN号不同,你肯定丢动作了。这样呢,它有针对性的去查询,这样可以提高恢复速度。

    在系统中呢,方便还原,库文件上有SCN号,每个对象上也有SCN号。


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

    1、系统检查点scn
    当一个检查点动作完成之后(check point),Oracle就把系统检查点的SCN存储到控制文件中。
    select checkpoint_change# from v$database;

    2、数据文件检查点scn
    当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在控制文件中。
    select name,checkpoint_change# from v$datafile;


    create table haha as select * from scott.emp;【创建了一个haha表,库发生改变】

    select name,checkpoint_change# from v$datafile; 【没有变化】
    select checkpoint_change# from v$database; 【没有变化】


    总结:没有变化,但是你的SCN号肯定是增加了,但是没有更新到数据文件上,也没有更新到控制文件上。
    在日志中更新了,为什么不往数据文件、控制文件上更新呢?
    因为SCN号是按着时间点和改变次数来变的,变得太频繁了,每变一次,更新一次,每变一次,更新一次,服务器压力太大了。
    只有在 输入 alter system checkpoint;  后会把检查点的SCN更新过去。

    select name,checkpoint_change# from v$datafile; 【有变化】
    select checkpoint_change# from v$database; 【有变化】




    3、启动scn
    Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,
    因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。
    select name,checkpoint_change# from v$datafile_header;【更新】


    4、终止scn【关库的时候,触发记录一个结束的SCN号,也进行一次同步,正常关库也记录一份SCN,保证所有SCN号相同,当你再重启库时,就不用恢复操作了】
    每个数据文件的终止scn都存储在控制文件中。
    select name,last_change# from v$datafile;
    在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null.

    shutdown immediate;
    startup mount;
    select name,last_change# from v$datafile;





  • 相关阅读:
    c#中out与ref的用法与区别
    一次不该出现的bug
    js弹出蒙版
    foreach中不能修改元素的值
    C#中使用正则表达式来过滤html字符
    细微之处才能显示水平
    js画直线 拓荒者
    XSLT模板转换XML文档 拓荒者
    怪异的JavaScript Date对象 拓荒者
    [转]C++ 笔记点滴 拓荒者
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/70c943ef17531cea66e2a832970a22ae.html
Copyright © 2020-2023  润新知