1. 深入了解oracle数据库的SCN

1.1. SCN的概念

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

1.2. SCN的管理方式

Oracle对SCN的管理,分为单节点和RAC两种方式。

单节点的instance中

单节点的instance中,SCN值存在SGA区,由system commit number latch保护。任何进程要得到当前的SCN值,都要先得到这个latch。

RAC/OPS环境中

Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法:

Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。

Commit广播算法:一有commit完成,最新的SCN就广播到所有节点中。

上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在多数系统 (除了Compaq Tur64 Unix)中,该参数的默认值都是700厘秒(centisecond),采用Lamport算法。如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中。

1.3. 几种重要的SCN

Commit SCN

当用户提交commit命令后,系统将当前scn赋给该transaction。这些信息都反映在redo buffer中,并马上更新到redo log 文件里。

Offline SCN

除了System tablespace以外的任何表空间,当我们执行SQL>alter tablespace … offline normal命令时,就会触发一个checkpoint,将内存中的dirty buffer写入磁盘文件中。Checkpoint完成后,数据文件头会更新checkpoint scn和offline normal scn值。其中数据库文件头的checkpoint scn值可通过查询列x$kccfe.fecps得到。

如果执行SQL>alter tablespace …offline命令时采用temporary或 immediate选项,而不用normal选项时,offline normal scn会被设成0。这样当数据库重启后通过resetlog方式打开时,该表空间就无法再改回在线状态。

Checkpoint SCN

当数据库内存的脏数据块(dirty blocks)写到各数据文件中时,就发生一次checkpoint。数据库的当前checkpoint scn值存在x$kccdi.discn中。Checkpoint scn在数据库恢复中起着至关重要的作用。无论你用何种办法恢复数据库,只有当各个数据库文件的checkpoint scn都相同时,数据库才能打开。

虽然参数“_allow_resetlogs_corruption”可以在checkpoint scn不一致时强制打开数据库,但是这样的数据库在open后必须马上作全库的export,然后重建数据库并import数据。

Resetlog SCN

数据库不完全恢复时,在指定时间点后的scn都无法再应用到数据库中。Resetlog时的scn就被设成当前数据库scn,redo log也会被重新设置。

Stop SCN

Stop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。

High and Low SCN

Oracle的Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。

在视图v$log_history中,sequence#代表redo log的序列号,first_change#表示当前redo log的low scn,列next_change#表示当前redo log的high scn。

SQL> col recid format 9999

SQL> col requence# format 9999

SQL> col first_change# format 9,999,999,999,999

SQL> col next_change# format 9,999,999,999,999

SQL> select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6;

RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#

----- ---------- ------------------ ------------------

484 484 1,928,645,840,091 1,928,645,840,436

485 485 1,928,645,840,436 1,928,645,840,636

486 486 1,928,645,840,636 1,928,778,045,209

487 487 1,928,778,045,209 1,929,255,480,725

488 488 1,929,255,480,725 1,930,752,214,033

1.4. SCN号与oracle数据库恢复的关系

SCN号与oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理,从而才能很好地解决这方面的问题。

SCN与CHECKPOINT

CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到数据文件。

CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。与checkpoint相关的SCN号有四个,其中三个存在控制文件中,一个存放在数据文件头中。

这四个分别是:

1.System Checkpoint SCN当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:

select checkpoint_change# from v$database;

2.Datafile Checkpoint SCN

当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。

select name,checkpoint_change# from v$datafile;

3.Start SCN号ORACLE将Start SCN号存放在数据文件头中。

这个SCN用于检查数据库启动过程是否需要做media recovery.

我们可以通过以下SQL语句查询:

select name,checkpoint_change# from v$datafile_header;

4.End SCN号ORACLE将End SCN号存放在控制文件中。

这个SCN号用于检查数据库启动过程是否需要做instance recovery.

我们可以通过以下SQL语句查询:

select name,last_change# from v$datafile;

在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL.

我们作个小的试验,内容如下:

在执行检查点进程之前SCN号如下:

System Checkpoint SCN 4609061

--select checkpoint_change# from v$database;

Datafile Checkpoint SCN 4609061

--select name,checkpoint_change# from v$datafile;

Start SCN 4609061

--select name,checkpoint_change# from v$datafile_header;

End SCN 空

--select name,last_change# from v$datafile;

执行alter system checkpoint。后的SCN号如下:

System Checkpoint SCN 4609630

--select checkpoint_change# from v$database;

Datafile Checkpoint SCN 4609630

--select name,checkpoint_change# from v$datafile;

Start SCN 4609630

--select name,checkpoint_change# from v$datafile_header;

End SC 空

--select name,last_change# from v$datafile;

SCN不连续原因可能如下:1.当发生日志组切换的时候

2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候

3.当运行ALTER SYSTEM SWITCH LOGFILE的时候

4.当运行ALTER SYSTEM CHECKPOINT的时候

5.当运行alter tablespace XXX begin backup,end backup的时候

6.当运行alter tablespace ,datafile offline的时候;

1.4.1. SCN号与数据库启动

在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有一个不同时,则需要做media recovery。如果在启动的过程中,End SCN号为NULL,则需要做instance recovery。ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery。

1.4.2. SCN号与数据库关闭

如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。

当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN号设置为NULL。如果数据库异常关闭的话,则END SCN号将为NULL.

1.4.3. 为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号

为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录

Datafile Checkpoint SCN号?

原因有二:

1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。

这三个SCN在表空间处于只读期间都将被冻结。

2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。

1.4.4. Recovery database using backup controlfile

当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。

这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN。根据上述的描述,此时需要采用using backup controlfile做recovery。

oracle数据库scn是什么,深入了解ORACLE数据库的SCN相关推荐

  1. oracle数据库6月之后的数据,Oracle数据库SCN存在可能在2019年6月导致宕机问题

    当前的问题 Oracle日前发布了两个公告在其官网上,简单描述为对应的数据库都需要打上对应的最小补丁,否则在2019年6月的时候可能会导致大范围宕机的情况. SCN是System Change Num ...

  2. oracle数据库无法查询,【案例】Oracle报错ORA-01194 ORA-01110 由于数据库SCN不一致导致无法启动...

    天萃荷净 使用_allow_resetlogs_corruption打开无归档日志rman备份库,运维DBA反映服务器宕机后,开启数据库报错ORA-01194 ORA-01110,分析原因为Oracl ...

  3. Oracle数据文件scn不一致,控制文件与数据文件头SCN不一致导致数据库无法启动故障处理...

    环境说明 OS操作系统:WINDOWS 2012 64位 数据库版 本:ORACLE 11.2.0.1 故障问题描述 客户反映数据库无法启动,报ORA-01589:要打开数据库必须使用RESETLOG ...

  4. oracle备份还原到本地_Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现...

    Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现 下面是我的一次从Oracle 11g R2 RAC到单实例间通过RMAN恢复备份集的过程,记录在此. 有些人以此方法作为 ...

  5. Oracle 12.2 新特性:在线PDB数据库克隆(Pluggable Hot Clone)

    Oracle 12.2 新特性:在线PDB数据库克隆(Pluggable Hot Clone) 在Oracle 12c的多租户(Multitenant)特性中,可以通过灵活的克隆复制来创建PDB(Pl ...

  6. oracle数据库报300006,Oracle归档日志所在目录时间不对Oracle集群日志时间显示错误...

    Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误 Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误 前言 这个问题在18 ...

  7. 手动修改oracle scn号,使用Oradebug修改Oracle SCN

    Oracle SCN对于数据库运行.维护而言是至关重要的因素.在启动从mount到open过程中,主要是各种文件的SCN进行比较的行为.通常情况下,我们是不需要介入到Oracle SCN的取值和设置, ...

  8. docker 离线安装 mysql_Oracle数据库之docker 离线环境安装oracle

    本文主要向大家介绍了Oracle数据库之docker 离线环境安装oracle,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 因测试需要,需在内网的测试环境搭建一套docker ...

  9. Python实现获得SQLServer数据库中的表插入到Oracle数据库

    SQL Server数据库连接 (1)SQL server 数据库连接需要pyodbc模块,而pyodbc的需要配置相应的开发环境 具体的连接: [link](步骤 1: 配置 pyodbc Pyth ...

最新文章

  1. uni-app 使用vue的语法+小程序的标签和API。
  2. 使用C#实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
  3. 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
  4. Bootstrap 堆叠式导航
  5. linux 命令行删除分区,如何在 Linux 中删除分区
  6. Pascal VOC 数据集国内下载
  7. opencv 显示程序运行时间
  8. 蚂蚁金服安全应急响应中心上线
  9. 数学模型的相关概念及意义等理论内容
  10. NOR FLASH闪存芯片ID应用之软件保护场景
  11. mysql自定义序号_mysql序列_mysql序列号生成器 mysql自定义函数生成序列号的例子...
  12. 【转载】Android App应用启动分析与优化
  13. 小程序直播公测,微信再造电商梦?
  14. Vue框架背后的故事
  15. 公众号被处罚后排名下滑
  16. linux命令之----sort命令用于将文本文件内容加以排序
  17. 制造企业发展第三方物流的思路探讨 (zt)
  18. JS图片灯箱(lightBox)效果基本原理和demo
  19. http live stream相关
  20. 为响应国家减税,SAP增值税如何调整 ?

热门文章

  1. c语言实现qsort排序函数
  2. ABAP VOFM定价过程的例程创建
  3. python识别魔方色块_解魔方机器人教程:识别颜色
  4. 微服务项目【秒杀商品展示及商品秒杀】
  5. Win10 笔记本本地摄像头提供 Rtsp 视频流服务
  6. 如何备份管家婆软件数据?3种方法详解
  7. opencv 最小二乘法拟合曲线
  8. 描述生活日常的句子、语录、短句、说说、文案
  9. iOS笔记-performSelector的探索
  10. 入行3D建模有什么职业可以选择?自学能学会3dsmax吗?