ITPub博客

首页 > 数据库 > Oracle > resetlogs和noresetlogs的用法

resetlogs和noresetlogs的用法

原创 Oracle 作者:startno 时间:2012-04-26 17:36:30 0 删除 编辑

有时在恢复数据库时,当要OPEN时,提示要以resetlogs和noresetlogs的方式打开。那么这两种方式有什么区别,在什么时候用什么方式

完全恢复 -- 利用重做日志或增量备份将数据块恢复到最接近当前时间的时间点。之所以叫做完整恢复是由于Oracle应用了归档日志和联机重做日志中所有的修改。如果只是数据文件损坏,且存在备份及备份以来的所有归档日志文件,那么就能把数据库完全恢复到发生介质损坏的那个时间点。完全恢复分为数据库级别,数据文件级别以及表空间级别。

不完全恢复 -- 需要将数据库恢复到历史上某个时间点,或由于丢失了联机日志件或某个归档日志文件,或者使用了以前备份的控制文件进行恢复,进行的恢复叫做不完全恢复。 换句话说,恢复过程中不会应用备份产生后生成的所有的重
做日志(可能应用部分或不应用)。

通常出现下面的情况需要进行不完全恢复:
a. 几个或全部的联机重做日志文件损坏;
b.由于个别归档日志文件的丢失无法进行完整的恢复;
c. 用户操作造成的数据丢失,比如,用户误删除了一张表, 这时可进行不完全恢复将数据库恢复到误操作之前的时间点;
d. 丢失了当前的控制文件,必须使用备份的控制文件打开数据库。不过只要所有的归档日志文件和联机日志文件都在,仍然能够恢复所有的数据。

为了执行不完整介质恢复,必须使用恢复时间点以前的备份来还原数据文件,并在恢复完成后使用RESETLOG选项打开数据库。resetlogs会重置日志序列号(变为1)强制清空或重建REDO, noresetlogs则不会 。

------ 关系:

1. 不完全恢复必须使用resetlogs ;

2. 使用resetlogs大多数情况下是做不完全恢复,但也可以做完全恢复(视丢失文件类型不同);

3.noresetlogs 必须做完全恢复时使用,但完全恢复不一定都是noresetlogs;`

4. 使用备份的控制文件需要使用using backup controlfile,使用using backup controlfile就需要使用resetlogs开启数据库;

5.使用resetlogs方式重建控制文件需要使用using backup controlfile,同上,需要使用resetlogs开启数据库;

6. 如果是以noresetlogs方式重建控制文件,不必要使用using backup controlfile,详细可以参考通过backup controlfile to trace 导出的脚本;(因为resetlogs重建控制文件是针对Use this only if online logs are damaged,而noresetlogs方式重建控制文件是针对the current versions of all online logs are available )

7. create controlfile resetlogs/noresetlogs 用noresetlogs重建控制文件时,控制文件中datafile Checkpoint SCN来自online logs中的current log头部,选择noresetlogs重建使得控制文件最新。如记录了最新的联机日志和日志序号。这个命令后介质恢复不是必需的。
- 用resetlogs重建控制文件时(一般是在线日志损坏时),控制文件中datafile checkpoint SCN来自各数据文件头。

8. 使用备份的控制文件(using backup controlfile)则需要使用resetlogs方式打开数据库(当然不一定是不完全恢复,备份的控制文件不能自动进行完全恢复, 可c 手工apply日志进行完全恢复; 重新创建控制文件则可以自动进行完全恢复);

9. 使用当前控制文件或noresetlogs方式重建控制文件来恢复,可以不需要resetlogs打开数据库;
备注: 备份的控制文件之所以不能自动进行完全恢复,是因为备份的控制文件的检查点SCN是比较旧的SCN, Oracle需要知道从哪个归档日志文件开始恢复,以及从这个归档日志文件的哪个位置开始恢复。存储在备份的控制文件中的日志序列号以及对应于控制文件检查点SCN的RBA (Redo Bytes Address)指出了从哪个归档文件开始以及从文件的哪个位置(重做记录)开始恢复。

1,RESETLOGS:

The following commands will create a new control file and use it
# to open the database.
# The contents of online logs will be lost and all backups will
# be invalidated. Use this only if online logs are damaged.
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
# Database can now be opened zeroing the online logs.

-- The second set opens the database with the RESETLOGS option and should be used if online logs are unavailable

2,NORESETLOGS:

The following commands will create a new control file and use it
# to open the database.
# Data used by the recovery manager will be lost. Additional logs may
# be required for media recovery of offline data files. Use this
# only if the current version of all online logs are available.
-- The first set opens the database with the NORESETLOGS option and should be used only if the current versions of all online logs are available.

采用resetlogs方式重建congtrolfile,scn来自于datafile;
采用noresetlogs方式重建controlfile,scn来自于redo

RESETLOGS会重设当前LOG sequence number为1,抛弃所有日志信息。
下列条件需要使用resetlog
1)在不完全恢复(介质恢复)
2)使用备份控制文件

1.在执行了不完全恢复后
2.在使用了备份的控制文件进行恢复后
3.使用带有resetlogs选项创建的控制文件恢复之后
A. 当在数据库无法nomount状态下,可以通过运行trace文件里的脚本创建控制文件,控制文件会自动创建参数文件中记录的控制文件位置(原控制文件会被覆盖)
B. 当redo log都可以用时,可通过noresetlogs参数重建控制文件,此时oracle能从日志文件中读取redo信息,记录到控制文件中,由于redo中记录的信息满足重演所有提交陈公的事务,所以能完全恢复,成功打开数据库.
C. 用resetlogs方式重建控制文件后,控制文件信息都是空的,oracle认为resetlogs放肆海峡,当前的日志文件已经损坏,oracle可能丢失提交成功的数据,恢复将是一次不完全的介质恢复。所以在恢复时,要用:recover database using backup controlfile until cancel;
D. 如果在线日志损坏,恢复到最后时,oracle提示的最后一个归档日志将是不存在的(如果在线日志未损坏,则可指定在线日志文件执行恢复),此时需要输入cancel取消恢复,用alter database open resetlogs;强制打开数据库。

resetlogs & noresetlogs 探究

最近做试验求证出这两个选项到底是什么作用:

很多人说,resetlogs就是不完全恢复,这是不对的,做不完全恢复必须使用resetlogs,但resetlogs也可以做完全恢复。而noresetlogs则是必须做完全恢复时使用。resetlogs会重置日志序列号强制清空或重建REDO,而noresetlogs则不会这么做。

数据库恢复分完全恢复和不完全恢复,完全恢复就是完整恢复数据库全部数据,但是完全恢复也要根据丢失的文件类型有所区分。

第一种情况,我们假设仅仅控制文件丢失,而其他文件没有丢失(主要是归档和REDO),那么恢复的时候如果选择从备份中恢复控制文件。恢复后,控制文件会去读数据文件头中与CHECKPOINT SCN对应的RBA信息来确定从那个序列的归档日志开始恢复,一直推进恢复到NEXT SCN是无穷大的那个REDOLOG,此时恢复是完全恢复的,但打开的时候还要以resetlogs方式打开,这样要重置归档日志的sequence,也就是说,如果你恢复时使用了备份控制文件,那么打开数据库时必然是要resetlogs的。附测试用例:

SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 35
下一个存档日志序列 37
当前日志序列 37
SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 37 52428800 1 NO CURRENT
341837 29-12月-08

2 1 35 52428800 1 YES ACTIVE
341817 29-12月-08

3 1 36 52428800 1 YES ACTIVE
341827 29-12月-08


SQL> select count(*) from t;

COUNT(*)
----------
30

10条记录在备份中,10条在归档日志中,10条在当前的REDO中,以下模拟控制文件丢失

SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
开

C:Documents and SettingsAdministrator>del G:oradataorcl*.CTL

C:Documents and SettingsAdministrator>rman target /

恢复管理器: Release 11.1.0.6.0 - Production on 星期一 12月 29 17:41:07 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount;

Oracle 实例已启动

系统全局区域总计 535662592 字节

Fixed Size 1334380 字节
Variable Size 213910420 字节
Database Buffers 314572800 字节
Redo Buffers 5844992 字节

RMAN> restore controlfile from 'G:backupCTL_C-1202355191-20081229-02';

启动 restore 于 29-12月-08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=153 设备类型=DISK

通道 ORA_DISK_1: 正在还原控制文件
通道 ORA_DISK_1: 还原完成, 用时: 00:00:07
输出文件名=G:ORADATAORCLCONTROL01.CTL
输出文件名=G:ORADATAORCLCONTROL02.CTL
输出文件名=G:ORADATAORCLCONTROL03.CTL
完成 restore 于 29-12月-08

RMAN> alter database mount;

数据库已装载
释放的通道: ORA_DISK_1

RMAN> recover database;

启动 recover 于 29-12月-08
启动 implicit crosscheck backup 于 29-12月-08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=153 设备类型=DISK
已交叉检验的 3 对象
完成 implicit crosscheck backup 于 29-12月-08

启动 implicit crosscheck copy 于 29-12月-08
使用通道 ORA_DISK_1
完成 implicit crosscheck copy 于 29-12月-08

搜索恢复区中的所有文件
正在编制文件目录...
目录编制完毕

已列入目录的文件的列表
=======================
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_27_4OK6HKRW_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_28_4OK6J11G_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_29_4OK6JKBQ_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_30_4OK6K37T_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_31_4OK6KO7B_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_32_4OK6L76C_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_33_4OK6LS8S_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_34_4OK6MCHN_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_35_4OK6MX8S_.
RC
文件名: G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_36_4OK6NH6T_.
RC

使用通道 ORA_DISK_1

正在开始介质的恢复

线程 1 序列 27 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_27_4OK6HKRW_.ARC 存在于磁盘上
线程 1 序列 28 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_28_4OK6J11G_.ARC 存在于磁盘上
线程 1 序列 29 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_29_4OK6JKBQ_.ARC 存在于磁盘上
线程 1 序列 30 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_30_4OK6K37T_.ARC 存在于磁盘上
线程 1 序列 31 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_31_4OK6KO7B_.ARC 存在于磁盘上
线程 1 序列 32 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_32_4OK6L76C_.ARC 存在于磁盘上
线程 1 序列 33 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_33_4OK6LS8S_.ARC 存在于磁盘上
线程 1 序列 34 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_34_4OK6MCHN_.ARC 存在于磁盘上
线程 1 序列 35 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_35_4OK6MX8S_.ARC 存在于磁盘上
线程 1 序列 36 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008
12_29O1_MF_1_36_4OK6NH6T_.ARC 存在于磁盘上
线程 1 序列 37 的归档日志已作为文件 G:ORADATAORCLREDO01.LOG 存在于磁盘上
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_27_4OK
HKRW_.ARC 线程=1 序列=27
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_28_4OK
J11G_.ARC 线程=1 序列=28
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_29_4OK
JKBQ_.ARC 线程=1 序列=29
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_30_4OK
K37T_.ARC 线程=1 序列=30
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_31_4OK
KO7B_.ARC 线程=1 序列=31
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_32_4OK
L76C_.ARC 线程=1 序列=32
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_33_4OK
LS8S_.ARC 线程=1 序列=33
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_34_4OK
MCHN_.ARC 线程=1 序列=34
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_35_4OK
MX8S_.ARC 线程=1 序列=35
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_36_4OK
NH6T_.ARC 线程=1 序列=36
归档日志文件名=G:ORADATAORCLREDO01.LOG 线程=1 序列=37 ------这一步注意看,是重点,是RESETLOGS方式自动恢复的
介质恢复完成, 用时: 00:00:05
完成 recover 于 29-12月-08

RMAN> exit


恢复管理器完成。

C:Documents and SettingsAdministrator>sqlplus / as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 12月 29 17:43:30 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from nam.t;

COUNT(*)
----------
30

SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 1
下一个存档日志序列 1
当前日志序列 1
SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 1 52428800 1 NO CURRENT
341863 29-12月-08

2 1 0 52428800 1 YES UNUSED
0

3 1 0 52428800 1 YES UNUSED
0


SQL>

至此完成完全恢复,事实证明不完全恢复时是必须RESETLOGS,但是完全恢复时如果使用备份控制文件来恢复,那么使用RESETLOGS一样可以完全恢复。但是丢失控制文件也可以不使用RESETLOGS方式打开数据库,这样也就可以避免重置日志序列号带来的不变,详情请见第四种情况




第二种情况,不完全恢复,不管你是要什么样的不完全恢复,SCN,TIME,跨越REDO,都必须使用resetlogs。测试用例可以参见EYGLE老师的相关教程。





第三种情况,丢失REDOLOG,这就更需要resetlogs了,因为resetlogs能够重建REDOLOG。如果你的REDOLOG、控制文件、数据文件丢失的话,需要先恢复控制文件,然后restore database;recover database;alter database open resetlogs;注意,这时候做的是不完全恢复,因为REDO没有了。在recover过程中可能会报错然后自动退出RMAN,无视,alter database open resetlogs即可,附测试用例:
C:Documents and SettingsAdministrator>sqlplus / as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 12月 29 15:12:57 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
开

C:Documents and SettingsAdministrator>rman target /

恢复管理器: Release 11.1.0.6.0 - Production on 星期一 12月 29 15:13:30 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount;

Oracle 实例已启动

系统全局区域总计 535662592 字节

Fixed Size 1334380 字节
Variable Size 213910420 字节
Database Buffers 314572800 字节
Redo Buffers 5844992 字节

RMAN> restore controlfile from 'g:backupCTRL_C-1202355191-20081229-05'
2> ;

启动 restore 于 29-12月-08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=153 设备类型=DISK

通道 ORA_DISK_1: 正在还原控制文件
通道 ORA_DISK_1: 还原完成, 用时: 00:00:07
输出文件名=G:ORADATAORCLCONTROL01.CTL
输出文件名=G:ORADATAORCLCONTROL02.CTL
输出文件名=G:ORADATAORCLCONTROL03.CTL
完成 restore 于 29-12月-08

RMAN> alter database mount;

数据库已装载
释放的通道: ORA_DISK_1

RMAN> restore database;

启动 restore 于 29-12月-08
启动 implicit crosscheck backup 于 29-12月-08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=153 设备类型=DISK
已交叉检验的 14 对象
完成 implicit crosscheck backup 于 29-12月-08

启动 implicit crosscheck copy 于 29-12月-08
使用通道 ORA_DISK_1
完成 implicit crosscheck copy 于 29-12月-08

搜索恢复区中的所有文件
正在编制文件目录...
没有为文件编制目录

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 G:ORADATAORCLSYSTEM01.DBF
通道 ORA_DISK_1: 将数据文件 00002 还原到 G:ORADATAORCLSYSAUX01.DBF
通道 ORA_DISK_1: 将数据文件 00003 还原到 G:ORADATAORCLUNDOTBS01.DBF
通道 ORA_DISK_1: 将数据文件 00004 还原到 G:ORADATAORCLUSERS01.DBF
通道 ORA_DISK_1: 将数据文件 00005 还原到 G:ORADATAORCLNAM01.DBF
通道 ORA_DISK_1: 正在读取备份片段 G:BACKUPB__20081229_28_1
通道 ORA_DISK_1: 段句柄 = G:BACKUPB__20081229_28_1 标记 = TAG20081229T142045
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:01:05
完成 restore 于 29-12月-08

RMAN> recover database;

启动 recover 于 29-12月-08
使用通道 ORA_DISK_1

正在开始介质的恢复

线程 1 序列 7 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_1
2_29O1_MF_1_7_4OJV5T1Y_.ARC 存在于磁盘上
线程 1 序列 8 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_1
2_29O1_MF_1_8_4OJV6989_.ARC 存在于磁盘上
线程 1 序列 9 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_1
2_29O1_MF_1_9_4OJWKFC7_.ARC 存在于磁盘上
线程 1 序列 10 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_
12_29O1_MF_1_10_4OJWKCNZ_.ARC 存在于磁盘上
线程 1 序列 11 的归档日志已作为文件 G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_
12_29O1_MF_1_11_4OJWKDKL_.ARC 存在于磁盘上
通道 ORA_DISK_1: 正在开始将归档日志还原到默认目标
通道 ORA_DISK_1: 正在还原归档日志
归档日志线程=1 序列=6
通道 ORA_DISK_1: 正在读取备份片段 G:BACKUPB__20081229_29_1
通道 ORA_DISK_1: 段句柄 = G:BACKUPB__20081229_29_1 标记 = TAG20081229T142204
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:01
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_6_4OJYG
PD6_.ARC 线程=1 序列=6
通道 default: 正在删除归档日志
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_6_4OJYG
PD6_.ARC RECID=113 STAMP=674752726
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_7_4OJV5
T1Y_.ARC 线程=1 序列=7
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_8_4OJV6
989_.ARC 线程=1 序列=8
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_9_4OJWK
FC7_.ARC 线程=1 序列=9
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_10_4OJW
KCNZ_.ARC 线程=1 序列=10
归档日志文件名=G:FLASH_RECOVERY_AREAORCLARCHIVELOG2008_12_29O1_MF_1_11_4OJW
KDKL_.ARC 线程=1 序列=11
无法找到归档日志
归档日志线程=1 序列=1
DBGANY: Mismatched message length! [15:18:53.296] (krmiduem)
DBGANY: Mismatched message length! [15:18:53.296] (krmiduem)
………………………………

RMAN> alter database open resetlogs;

使用目标数据库控制文件替代恢复目录
数据库已打开

RMAN> exit

SQL> select * from nam.t;

ID TDATE TSCN
---------- -------------- ----------
1 29-12月-08 339936
2 29-12月-08 339946
3 29-12月-08 339956
4 29-12月-08 339966
1 29-12月-08 339996
2 29-12月-08 339996
3 29-12月-08 339996
4 29-12月-08 339996
1 29-12月-08 340131
2 29-12月-08 340141
3 29-12月-08 340151

ID TDATE TSCN
---------- -------------- ----------
4 29-12月-08 340161

已选择12行。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 1 52428800 1 NO CURRENT
340183 29-12月-08

2 1 0 52428800 1 YES UNUSED
0

3 1 0 52428800 1 YES UNUSED
0


SQL>

从数据验证的结果来看,除了REDO里面的记录没有恢复,其他基本都恢复了,REDO及ARCHIVELOG的序列被重置。



第四种情况,没有丢失控制文件及各种日志,仅丢失数据文件,这种问题比较常见,有可能磁盘损坏造成数据文件丢失,等磁盘故障排除后,需要恢复,此时的恢复就很简单了,restore database;recover database;alter database open;就一切OK,也就是说,在不使用备份控制文件恢复的情况下,是可以使用noresetlog方式打开数据库的。前提有一,不能丢失日志文件。假若丢失了控制文件和数据文件但还是想以noresetlog打开的话,就必须手动以noresetlogs方式重建控制文件,而且REDOLOG的状态都必须正常,否则是无法使用noresetlogs方式打开。
SQL> select count(*) from t;

COUNT(*)
----------
32

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- -------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 19 52428800 1 YES ACTIVE
340578 29-12月-08

2 1 20 52428800 1 YES ACTIVE
340588 29-12月-08

3 1 21 52428800 1 NO CURRENT
340598 29-12月-08


SQL> archive log list;
ORA-01031: 权限不足
SQL> conn / as sysdba
已连接。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 19
下一个存档日志序列 21
当前日志序列 21
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
开

C:Documents and SettingsAdministrator>rman target /

恢复管理器: Release 11.1.0.6.0 - Production on 星期一 12月 29 15:52:36 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

连接到目标数据库: ORCL (DBID=1202355191)

RMAN> backup database plus archivelog delete all input;

……………………过程省略………………………………由于我之前数据库备份搞的序列都乱了,所以需要重新备份用于这个测试,这里我只模拟丢失控制文件的情况

SQL> conn nam/nam
已连接。
SQL> begin
2 for i in 1 .. 10 loop
3 insert into t values(i,sysdate,dbms_flashback.get_system_change_number);
4 commit;
5 execute immediate 'alter system switch logfile';
6 dbms_lock.sleep(15);
7 end loop;
8 end;
9 /

PL/SQL 过程已成功完成。

SQL> begin
2 for i in 1 .. 10 loop
3 insert into t values(i,sysdate,dbms_flashback.get_system_change_number);
4 end loop;
5 commit;
6 end;
7 /

PL/SQL 过程已成功完成。

SQL> select count(*) from t;

COUNT(*)
----------
52

32条记录在备份中,10条在归档中,10条在redo中


SQL> shutdown abort;
ORA-01031: 权限不足
SQL> conn / as sysdba
已连接。
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL>exit

C:Documents and SettingsAdministrator>rman target /

恢复管理器: Release 11.1.0.6.0 - Production on 星期一 12月 29 16:10:09 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount;

Oracle 实例已启动

系统全局区域总计 535662592 字节

Fixed Size 1334380 字节
Variable Size 213910420 字节
Database Buffers 314572800 字节
Redo Buffers 5844992 字节

RMAN> restore controlfile from 'g:backupCTRL_C-1202355191-20081229-07';
………………………………(过程由于粗心没有及时复制)

RMAN> alter database mount;
………………………………(过程由于粗心没有及时复制)

RMAN> restore database;
………………………………(过程由于粗心没有及时复制)


SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> startup nomount;
ORACLE 例程已经启动。

Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 213910420 bytes
Database Buffers 314572800 bytes
Redo Buffers 5844992 bytes
SQL> alter database mount;

数据库已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> startup nomount;
ORACLE 例程已经启动。

Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 213910420 bytes
Database Buffers 314572800 bytes
Redo Buffers 5844992 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 'G:ORADATAORCLREDO01.LOG' SIZE 50M,
9 GROUP 2 'G:ORADATAORCLREDO02.LOG' SIZE 50M,
10 GROUP 3 'G:ORADATAORCLREDO03.LOG' SIZE 50M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'G:ORADATAORCLSYSTEM01.DBF',
14 'G:ORADATAORCLSYSAUX01.DBF',
15 'G:ORADATAORCLUNDOTBS01.DBF',
16 'G:ORADATAORCLUSERS01.DBF',
17 'G:ORADATAORCLNAM01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;

控制文件已创建。

SQL> recover database;
完成介质恢复。
SQL> select count(*) from nam.t;

COUNT(*)
----------
52

SQL>


另外,如果丢失初始化参数文件,也不过是在开头多了一个恢复步骤而已

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23862439/viewspace-1058033/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-05-02

  • 博文量
    24
  • 访问量
    88108