一。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、Datafile Checkpoint SCN和

Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有

一个不同时,则需要做media recovery.

ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery.

如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE

会将END SCN号设置为NULL.

如果数据库异常关闭的话,则END SCN号将为NULL.则需要做instance recovery.

四。为什么需要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号,可以区分控制文件是否是当前的控制文件。

五。Recovery database using backup controlfile

当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制

文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录System

Checkpoint SCN的原因之一。

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

六。示例

例子背景:

oracle 8i

windows

采用rman做热备,在备份期间,做不少事务,同时做alter system checkpoint.

RMAN> run {

2> allocate channel c1 type disk;

3> backup database filesperset 3 format 'e:/full_%p_%t.bak';

4> }

(这里需要一提的是,在这个备份角本里面我们加了filesperset 3。这样将整个数据库分成

两个备份集。这样还原出来的数据文件其checkpoint_change#将不一样。

否则由于数据库数据文件不多,都将包含在一个备份集中,这样即使在备份中做insert操作和alter system

checkpoint也不会产生不同的checkpoint_change#。因为rman备份是将一个备份集中的文件同时备份的。

而checkpoint_change#是存放在数据文件头部的,这样备份这些数据文件的头部的时间将是很快的。)

然后

RMAN> run{

2> allocate channel c1 type disk;

3> restore database;

4> }

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

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

2156662354

SQL> select file#,checkpoint_change# from v$datafile;

FILE# CHECKPOINT_CHANGE#

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

1 2156662355

2 2156662354

3 2156662322

4 2156662354

5 2156662354

6 2156662354

SQL> select file#,checkpoint_change# from v$datafile_header;

FILE# CHECKPOINT_CHANGE# LAST_CHANGE#

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

1 2156662355

2 2156662349

3 2156662322

4 2156662342

5 2156662349

6 2156662342

从这里可以看出,显然是需要做media recovery的。正常情况下,还需要做instance recovery.

当然由于没有在线日志,所以只能做resetlogs。

1.有归档日志存

若有归档日志在,则只需要做一个recover database until cancel;

然后即可alter database open resetlogs;

SQL> recover database until cancel (using backup controlfile);

ORA-00279: change 2156621770 generated at 10/07/2005 14:30:06 needed for thread 1

ORA-00289: suggestion : D:ORACLE8IRDBMSARC00738.001

ORA-00280: change 2156621770 for thread 1 is in sequence #738

Specify log: {=suggested | filename | AUTO | CANCEL}

auto

ORA-00279: change 2156621779 generated at 10/07/2005 14:30:51 needed for thread

1

ORA-00289: suggestion : D:ORACLE8IRDBMSARC00739.001

ORA-00280: change 2156621779 for thread 1 is in sequence #739

ORA-00278: log file 'D:ORACLE8IRDBMSARC00738.001' no longer needed for this recovery

ORA-00308: cannot open archived log 'D:ORACLE8IRDBMSARC00739.001'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open resetlogs;

Database altered.

2.无归档日志

如果没有归档日志,由于restore出来是没有在线日志的。

如果v$datafile_header中checkpoint_change#是相同的,此时由于控制文件中checkpoint_change#

比数据文件头中要高,所以数据库还是需要做media recovery。

此时重建控制文件还是一样的,因为重建控制文件后,在控制文件中checkpoint_change#为0,

与文件头的checkpoint_change#还是不一样,还需要media recovery.且由于控制文件中checkpoint_change#

比文件头中要高,所以做recover时还需要加上using backup controlfile.

注意,这时由于没有在线日志,所以重建控制文件需要将noresetlogs改成RESETLOGS才可以创建成功,

否则会报以下错误:

ORA-01565: error in identifying file 'D:ORACLE8IORADATAORA8IREDO01.LOG'

ORA-27041: unable to open file

如:

CREATE CONTROLFILE REUSE DATABASE "ORA8I" RESETLOGS ARCHIVELOG

MAXLOGFILES 32

MAXLOGMEMBERS 2

MAXDATAFILES 254

MAXINSTANCES 1

MAXLOGHISTORY 226

LOGFILE

GROUP 1 'D:ORACLE8IORADATAORA8IREDO01.LOG' SIZE 1M,

GROUP 2 'D:ORACLE8IORADATAORA8IREDO02.LOG' SIZE 1M,

GROUP 3 'D:ORACLE8IORADATAORA8IREDO03.LOG' SIZE 1M

DATAFILE

'D:ORACLE8IORADATAORA8ISYSTEM01.DBF',

'D:ORACLE8IORADATAORA8IRBS01.DBF',

'D:ORACLE8IORADATAORA8IUSERS01.DBF',

'D:ORACLE8IORADATAORA8ITEMP01.DBF',

'D:ORACLE8IORADATAORA8ITOOLS01.DBF',

'D:ORACLE8IORADATAORA8IINDX01.DBF'

CHARACTER SET ZHS16GBK

;

此时scn号信息如下:

SQL> select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE# from v$database;

CHECKPOINT_CHANGE# CONTROLFILE_CHANGE#

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

0 0

此时由于没有归档日志和在线日志,无法做recovery。

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 2156662342 generated at 10/07/2005 17:06:27 needed for thread 1

ORA-00289: suggestion : D:ORACLE8IRDBMSARC00749.001

ORA-00280: change 2156662342 for thread 1 is in sequence #749

Specify log: {=suggested | filename | AUTO | CANCEL}

cancel

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01152: file 1 was not restored from a sufficiently old backup

ORA-01110: data file 1: 'D:ORACLE8IORADATAORA8ISYSTEM01.DBF'

ORA-01112: media recovery not started

所以也就无法做alter database open Resetlogs了。

此时可以加上_allow_resetlogs_corruption隐含参数,然后就可以alter database open resetlogs

将数据库打开了。

当然如果v$datafile_header中checkpoint_change#是不相同的,那么此时就没有什么常归有效的办法能将

数据库打开了。

如果相差不多,加上隐含参数_allow_resetlogs_corruption,然后alter database open resetlogs

还是有可能可以打开的。这个参数oracle是不建议加的,且加上这个参数也只是有可能可以打开。

这个参数是以最oldest的scn将数据库打开,所以最好system数据文件的scn号是最oldest的,否则容易产生

大量的600号错误。

oracle scn与数据恢复,SCN与数据库恢复的关系相关推荐

  1. oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系

    天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...

  2. oracle恢复关系,SCN与Oracle数据库恢复的关系–补充

    一.为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号 1.对只读表空间,其数据文件的Datafile Checkpoint SCN.Start ...

  3. oracle支持非关系数据库,Oracle-03: 关系型数据库和非关系的数据库的各自优缺点与区别...

    Oracle-03: 关系型数据库和非关系的数据库的各自优缺点与区别 ------------ 吾亦无他, 唯手熟尔, 谦卑若愚, 好学若饥 ------------- 常见的非关系型数据库:Mong ...

  4. oracle sql '[[alpha]]',Alpha865qqz.id 加密数据库恢复

    接到一网友新的加密勒索文件恢复请求,加密文件类似: 对应的!!! HOW TO BACK YOUR FILES !!!.TXT文件说明 YOUR FILES ARE ENCRYPTED !!! TO ...

  5. oracle通过表空间文件进行数据库恢复,oracle通过DBF恢复数据

    前一段客户运行的项目数据库突然崩溃,并且没有进行数据备份.解决办法: 1,安装oracle 10g数据库并创建一个要恢复的数据库相同一的实例(注意:最好是新安装的数据库,并且安装的数据库尽量和要恢复的 ...

  6. pe系统备份oracle数据库,Oracle 通过表空间文件进行数据库恢复

    操作系统:WindowsXP2 数据库:oracle 10g 由于数据库服务器崩溃,造成了无法进入系统进行数据库备份,只能从光盘的PE系统把oracle相关文件拷贝出来.对于拷贝出来的文件在测试机上进 ...

  7. oracle通过表空间文件进行数据库恢复,Oracle数据库表空间恢复方案_oracle

    一. 用户表空间 错误: 在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdown normal或shutdown immed ...

  8. mysql innodb 数据恢复_MYSQL INNODB 数据库恢复 转

    昨天遇到个很郁闷的问题,mysql莫名其妙崩溃了. 启动的时候报错,然后就time out了. 把里面的数据表格都拷贝出来,然后拷贝ibdata1,再把数据库export出来. //========= ...

  9. oracle的scn增量备份,Oracle技术之利用scn增量备份实现数据库增量恢复

    数据库版本 SQL> select * from v$version; BANNER ------------------------------------------------------ ...

最新文章

  1. CRNN维度变换的解释这样你也可以自定义CRNN了
  2. 剑指offer之51-55题解
  3. python中3 and not 5_python中not、and和or的优先级与详细用法介绍
  4. Windows Embedded Webcast 2008年1月预告
  5. POJ2955Brackets——dp
  6. 《MapReduce 2.0源码分析与编程实战》一1.5 看,大象也会跳舞
  7. linux下wps的字体缺失解决方法
  8. linux常用命令(3)——系统管理1
  9. Linux中的cp命令老九门
  10. python小_Python 小入坑
  11. WORDNET与HOWNET之比较
  12. python解压zip到当前目录_Python 解压缩Zip和Rar文件到指定目录
  13. PMP 第六章 项目时间管理
  14. React-Navigation的goBack()跳转到指定页面,以及不同栈之间的页面的返回操作
  15. excel文件损坏修复绝招_Access文件频繁损坏的解决方法
  16. 双目是个词吗_描写眼睛的词语3个字
  17. java水果爆炸动画_5分钟快速实现Android爆炸破碎酷炫动画特效的示例
  18. 图解 CMMI 2.0之(四)能力等级和成熟度等级
  19. TCP/UDP 端口及部分端口的作用
  20. 深度学习入门之python读取图片转化为向量

热门文章

  1. python excel web_使用python在WEB页面上生成EXCEL文件
  2. python创建mysql数据库_python 怎么创建create mysql的数据库
  3. CSS之布局(外边距的折叠)
  4. js时间戳转换成日期格式
  5. SpringMVC权限管理
  6. 数据齿轮(DataGear)数据库管理系统 v1.1.1 发布
  7. maven项目中 把依赖的jar包一起打包
  8. js ~取非运算符的妙用,将-1转为0(或假值)
  9. Python中处理时间 —— time模块
  10. 【原创】Kakfa utils源代码分析(三)