`

scn号与恢复研究

阅读更多

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、Datafile Checkpoint SCN和Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有一个不同时,则需要做media recovery。此处个人认为有问题,应该是比较cnt,而不是scn

如果在启动的过程中,End SCN号为NULL,则需要做instance recovery.
ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery.

 

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

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

 

四。为什么需要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号错误。

分享到:
评论

相关推荐

    scn号与恢复研究.pdf

    ### SCN号与Oracle数据库恢复研究 #### 一、SCN与Checkpoint 在Oracle数据库中,SCN(System Change Number)是一个非常重要的概念,它用来标识数据库中的任何改变。SCN是Oracle内部使用的数字序列,每当数据库发生...

    BLOG_Oracle_lhr_Oracle SCN的一点研究.pdf

    Oracle数据库中的SCN(System Change Number,系统改变号)是Oracle系统内部维护的一种序列号,它随着系统更新自动增加,用于标记数据库中的每一个改变,保证数据的一致性和顺序恢复。SCN在数据库中无处不在,几乎...

    检查点SCN深入研究

    检查点SCN(System Change Number)是Oracle数据库中用于数据一致性与恢复的关键概念。SCN是一个全局递增的序列号,记录了数据库发生的每一次变化,确保在实例故障或崩溃后,能够通过重做日志恢复到一致性的状态。 ...

    ORACLE SCN增长过快问题研究和解决方案探索.pdf

    SCN是一个递增的计数器,它在每次事务提交时都会增加,确保数据的一致性和可恢复性。然而,在某些情况下,SCN可能会异常快速增长,这对数据库的稳定性和性能带来严重影响。 **SCN增长过快的现象:** 1. 数据库的...

    论文研究-Oracle8i数据库日志文件的分析与恢复.pdf

    2. 重做记录结构:重做记录包含多个字段,例如事务标识符(TYP)、更改类型(CLS)、表空间号(AFN)、数据块地址(DBA)、系统更改编号(SCN)等。每个字段都有其明确的含义和用途。 3. 重做日志的物理结构:...

    Oracle9i数据库备份恢复初步研究

    ### Oracle9i数据库备份恢复初步研究 #### 一、引言 随着信息技术的发展,数据库作为信息存储的核心组件,在金融、电信、政府等多个领域扮演着极其重要的角色。由于数据的重要性日益增加,一旦发生数据丢失或损坏...

    Oracle数据库恢复管理器研究及应用.pdf

    4. **块级增量备份策略**:RMAN的块级增量备份基于每个数据块的系统更改号(SCN),只备份自上次增量备份以来发生变化的数据块。这种策略减少了备份时间和资源需求,同时方便执行,无论是联机还是脱机。 5. **增量...

    oracle快速数据恢复技术研究.pdf

    6. **安全性与限制** 虽然Flashback技术强大,但也有其安全性和资源使用上的考虑。启用Flashback需要足够的磁盘空间存储撤销信息,并且需要合理设置Undo表空间大小以保持足够长的撤销历史。此外,为了防止数据被...

    基于Oracle数据库的备份恢复机制的研究.pdf

    恢复过程中可能需要用到ALTER DATABASE ROLLBACK TO SCN或RESTORE DATABASE命令,结合RECOVER DATABASE命令来应用重做日志,确保数据一致性。 总的来说,Oracle数据库的备份恢复机制是一个复杂但至关重要的领域,...

    Oracle RMAN 11g Backup and Recovery

    - `recover`: 在恢复过程中使用,用于将数据库恢复到特定时间点或SCN(系统更改号)。 - **常用选项**: - `incremental level`: 设置增量备份的级别。 - `tag`: 为备份设置标签,便于管理和检索。 - `format`: ...

    scnscrap:用于抓取scn博客的简单项目

    **标题解析:** "scnscrap"是一个用于抓取SAP Community Network(SCN)博客的简单项目。它的主要功能是搜集SCN论坛上的用户博客文章,并且能够...通过这个工具,开发者或研究者可以更好地理解SCN社区的动态和趋势。

    高级数据库系统调研报告1.docx

    本文档是关于 Oracle 数据库的事务管理和故障恢复技术的研究报告。报告主要介绍了 Oracle 数据库的事务管理技术特点,包括事务的概念、事务的特性、事务控制语句、并发控制机制等。同时,本报告还对 Oracle 数据库的...

    深入解析OracleDBA入门进阶与诊断案例 3/4

    针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手...

    深入解析OracleDBA入门进阶与诊断案例 4/4

    针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手...

    深入解析OracleDBA入门进阶与诊断案例 2/4

    针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手...

    NeuroimageTools-main_结构协变网络构建_

    通过比较正常人群与病患的SCN,可以揭示异常的连接模式,有助于发现疾病的潜在生物标记。 "NeuroimageTools-main"可能包含用于执行上述步骤的脚本、代码库或工具集,支持数据导入、预处理、网络构建和分析等功能。...

    oracle事务控制机制研究.pdf

    3. **隔离性 (Isolation)**:事务的修改与其他事务隔离,避免脏读、不可重复读和幻读等问题。Oracle提供不同级别的事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读...

    petri net.pdf

    在供应链管理中,一个关键的概念是韧性(resilience),即系统在面对破坏时的能力恢复到正常功能。这种韧性通常通过缓解策略和响应措施来实现。对于供应链来说,拥有前瞻性的韧性意味着能够预测潜在的风险,并采取...

    普拉克索对6-OHDA帕金森病模型生物节律的影响

    在生物节律相关基因的表达方面,研究发现高剂量普拉克索在视交叉上核(Suprachiasmatic nucleus, SCN)中引起了Bmal1的异常表达,而低剂量普拉克索可以恢复6-OHDA模型中Rorα mRNA水平的异常。在肝脏组织中,低剂量...

Global site tag (gtag.js) - Google Analytics