Oracle 控制文件的恢复:控制文件全部损坏的情况

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638    QQ号:47079569    邮箱:service@parnassusdata.com

 

 

[概要]

本文中主要介绍Windows平台上的oracle数据库,所有的控制文件都损坏时的修复方法。

 

・将控制文件镜像化,其中一部分损坏时   –> Krown:71181 へ

・ 所有的控制文件均损坏时–> Krown:71490  へ

 

※在初始化参数文件中,类似

—-

control_files=’D:\o920\oradata\ora9204\control01.ctl’,’D:\o920\oradata\ora9204\control02.ctl’一样,只要指定了多个文件的话就会镜像化

—-

 

 

[目标版本]

Oracle9i Database Release2 (9.2)

Oracle9i Database Release1 (9.0.1)

Oracle8i Enterprise Edition/Oracle8i Standard Edition 8.1

Oracle8 Enterprise Edition/Oracle8 Standard Edition 8.0

Oracle7 Server/Oracle7 Workgroup Server 7.3

 

 

[目标平台]

Windows

 

 

[修复对策]

控制文件都损坏时,会输出以下报错。

—-

ORA-00202: controlfile: ‘D:\o920\oradata\ora9204\control01.ctl’

ORA-27041: unable to open file

OSD-04002: 无法启动文件

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

—-

 

满足以下条件时,请查看【恢复对策A】

・这是用冷备份或者 alter database backup controlfile to ‘文件名’来备份控制文件的归档日志模式

 

满足以下条件时,请查看【恢复对策B】

・通过alter database backup controlfile to trace;获得控制文件的备份

・完全没有备份

・非归档日志文件模式

 

 

[修复对策A]

通过 冷备份或者 alter database backup controlfile to ‘文件名’备份控制控制文件,并且这是归档日志模式的修复方法。

 

假设环境如下所示:

%ORACLE_HOME%                   D:\o920

%ORACLE_SID%                    ora9204

储存备份的地址      D:\BACKUP

Restore备份的地址  D:\o920\oradata

 

如果不知道restore的地址时,请mount数据库,查看 v$datafile 的 NAME。

—-

SQL> select name from v$datafile;

NAME

———————————————

D:\O920\ORADATA\ORA9204\SYSTEM01.DBF

D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF

D:\O920\ORADATA\ORA9204\DRSYS01.DBF

D:\O920\ORADATA\ORA9204\INDX01.DBF

D:\O920\ORADATA\ORA9204\TOOLS01.DBF

D:\O920\ORADATA\ORA9204\USERS01.DBF

D:\O920\ORADATA\ORA9204\XDB01.DBF

—-

 

A-1)数据库启动时,shut down。

(控制文件损坏时,无法执行 shutdown normal)

—-

SQL> shutdown abort

ORACLE实例shut down。

—-

 

A-2)将备份完成的控制文件restore到 D:\o920\oradata 中。

—-

C:\>copy D:\BACKUP\CONTROL1.bak D:\o920\oradata\ora9204\CONTROL01.CTL

是否覆盖D:\o920\oradata\ora9204\CONTROL01.CTL ,覆盖 (Yes/No/All): y <–y

复制1个文件。

—-

 

A-3)查看指定了初始化参数文件的控制文件的部分。

这次的情况,因为只restore了ora9204\CONTROL01.CTL,对应部分如下所示。

—-

control_files=’D:\o920\oradata\ora9204\ora9204\CONTROL01.CTL’

—-

 

A-4)mount数据库

—-

SQL> startup mount

—-

 

※如果,上述3个顺序中,没有指定正确的控制文件的位置时,会输出以下ORA-205。

—-

SQL> startup

ORACLE instance started.

Total System Global Area  135339844 bytes

Fixed Size                   454468 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

ORA-00205: error in identifying controlfile, check alert log for more info

—-

 

A-5)执行recover database using backup controlfile until cancel;不完全恢复。

 

执行recover database using backup controlfile until cancel;后,

按下 Enter,请应用归档日志文件。

—-

SQL> recover database using backup controlfile until cancel;

ORA-00279: 变更943184(11/24/2003 19:19:50时生成)时需要线程1

ORA-00289: 需要讨论日志文件:D:\O920\ORADATA\ORA9204\ARCHIVE1_19.DBF

ORA-00280: 变更943184(线程1)存在于顺序编号19之中。

ORA-00278: 日志文件’D:\O920\ORADATA\ORA9204\ARCHIVE1_18.DBF’不需要这样的恢复

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}          <–按下Enter,应用归档日志

 

ORA-00279: 变更943186(11/24/2003 19:19:51时生成)时需要线程1

ORA-00289: 需要讨论日志文件:D:\O920\ORADATA\ORA9204\ARCHIVE1_20.DBF

ORA-00280: 变更943186(线程1)存在于顺序编号20。

ORA-00278:日志文件’D:\O920\ORADATA\ORA9204\ARCHIVE1_19.DBF’不需要这些恢复

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}          <–按下Enter,应用归档日志

 

ORA-00279: 变更943190(11/24/2003 19:19:57时生成)时需要线程1

ORA-00289: 需要讨论的日志文件:D:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBF

ORA-00280:变更943190((线程1)存在于顺序编号21。

ORA-00278: 日志文件’D:\O920\ORADATA\ORA9204\ARCHIVE1_20.DBF’不需要这些恢复

 

指定日志:: {<RET>=suggested | filename | AUTO | CANCEL}          <-按下Enter,应用归档日志

 

ORA-00308:无法启动归档日志D:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBF。

ORA-27041: 无法启动文件。

OSD-04002: 无法启动文件

O/S-Error: 无法发现(OS 2)指定的文件。

 

ORA-01547: 警告: RECOVER成功OPEN

RESETLOGS出现以下错误。

ORA-01152: 文件1没有从旧备份中restore。

ORA-01110:数据文件1: ‘D:\O920\ORADATA\ORA9204\SYSTEM01.DBF’

—-

 

※输出ORA-308,要求还么有制成的归档REDO日志。

这时,重新执行recover database using backup controlfile until cancel;

明确指定online REDO日志的绝对路径。

详细内容请参考Krown:34587。

 

对应的online REDO日志可以通过 alert.log 查看。

从上述的信息中,要求顺序编号21。通过alert.log

查看sequence 21 相关内容。

—-

Mon Nov 24 19:19:57 2003

Current log# 3 seq# 21 mem# 0: D:\O920\ORADATA\ORA9204\REDO03.LOG

—-

记录的文件路径对应的online REDO日志的绝对路径。

 

重新、recover database using backup controlfile until cancel;

—-

SQL> recover database using backup controlfile until cancel;

ORA-00279: 変更943190(11/24/2003 19:19:57时生成)需要线程1

ORA-00289: 需要讨论的日志文件:D:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBF

ORA-00280: 変更943190(线程1)存在于顺序编号21中。

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

D:\O920\ORADATA\ORA9204\REDO03.LOG                     <–指定online REDO 日志的绝对路径

应用日志。

介质恢复完成。

—-

 

A-6)通过resetlogs 启动数据库

—-

SQL> alter database open resetlogs;

不过数据库。

—-

 

A-7)使用控制文件的备份进行恢复时,删除所有控制文件中的本地管理临时表区域的临时文件信息。

因此,需要重新追加本地管理临时表区域的临时文件。

 

在这个状态下使用临时表区域,执行sort处理的话,就会发生ORA-25153错误。

—-

SQL> select count(*) from TEST;

select count(*) from TEST

*

行1中发生了错误。:

ORA-25153: 临时表区域为空。

—-

执行

alter tablespace <临时表区域名> add tempfile ‘<文件名>’ size <文件尺寸> reuse;

—-

SQL> alter tablespace temp add tempfile ‘D:\o920\oradata\ora9204\TEMP.DBF’

2  size 300M reuse;

变更表区域。

—-

详细内容请参考Krown:66029。

 

A-8)马上终止数据库,制成数据库整体的备份。不这样的话,reset日志后,就无法恢复已变更的项目了。详细备份请参考Krown:70947。

 

以上工作完成。

没有镜像化控制文件时,请执行镜像化。

 

 

[修复对策B]

获得 alter database backup controlfile to trace; 中控制文件的备份。或者完全没有备份,或者非归档日志模式下控制文件全部损坏时的修复方法。

 

假设环境如下所示:

%ORACLE_HOME%                   D:\o920

%ORACLE_SID%                    ora9204

储存备份的地址      D:\BACKUP

Restore备份的地址  D:\o920\oradata

 

不知道restore地址的情况,mount数据库,请查看 v$datafile 的NAME 列。

—-

SQL> select name from v$datafile;

NAME

———————————————

D:\O920\ORADATA\ORA9204\SYSTEM01.DBF

D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF

D:\O920\ORADATA\ORA9204\DRSYS01.DBF

D:\O920\ORADATA\ORA9204\INDX01.DBF

D:\O920\ORADATA\ORA9204\TOOLS01.DBF

D:\O920\ORADATA\ORA9204\USERS01.DBF

D:\O920\ORADATA\ORA9204\XDB01.DBF

—-

 

B-1)启动了实例时,shutdown。

(控制文件损坏时,无法执行 shutdown normal)

—-

SQL> shutdown abort

ORACLE实例shutdown完成。

—-

 

B-2)通过alter database backup controlfile to trace;将 获得的控制文件的备份保持在脚本中。

 

例:create_cf.sql

CREATE CONTROLFILE REUSE DATABASE “ORA9204” NORESETLOGS  ARCHIVELOG

MAXLOGFILES 5

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 1

MAXLOGHISTORY 226

LOGFILE

GROUP 1 (

‘D:\O920\ORADATA\ORA9204\REDO01_B.LOG’,

‘D:\O920\ORADATA\ORA9204\REDO01_A.LOG’

) SIZE 100M,

GROUP 2 (

‘D:\O920\ORADATA\ORA9204\REDO02_A.LOG’,

‘D:\O920\ORADATA\ORA9204\REDO02_B.LOG’

) SIZE 100M,

GROUP 3 (

‘D:\O920\ORADATA\ORA9204\REDO03_A.LOG’,

‘D:\O920\ORADATA\ORA9204\REDO03_B.LOG’

) SIZE 100M

DATAFILE

‘D:\O920\ORADATA\ORA9204\SYSTEM01.DBF’,

‘D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF’,

‘D:\O920\ORADATA\ORA9204\CWMLITE01.DBF’,

‘D:\O920\ORADATA\ORA9204\DRSYS01.DBF’,

‘D:\O920\ORADATA\ORA9204\EXAMPLE01.DBF’,

‘D:\O920\ORADATA\ORA9204\INDX01.DBF’,

‘D:\O920\ORADATA\ORA9204\ODM01.DBF’,

‘D:\O920\ORADATA\ORA9204\TOOLS01.DBF’,

‘D:\O920\ORADATA\ORA9204\USERS01.DBF’,

‘D:\O920\ORADATA\ORA9204\XDB01.DBF’;

;

 

[注意]

  1. 如果没有对控制文件镜像化时,备份也无法使用时,参考上述例子,OS命令以及Explorer等,查看实际存在的文件,请手动制成脚本

 

  1. 上述例子中,归档日志节点中的例。非归档日志模式事,需要在NORESETLOGS NOARCHIVELOG 中编辑NORESETLOGS ARCHIVELOG。

 

  1. 通过trace 选项获得的控制文件的备份时,有多个CREATE CONTROLFILE语句

—-

CREATE CONTROLFILE REUSE DATABASE “ORA9204” NORESETLOGS  ARCHIVELOG

—-                       ^^^^^^^^^^^

NORESETLOGS 指定可以使用REDO日志文件的情况。

 

—-

CREATE CONTROLFILE REUSE DATABASE “ORA9204” RESETLOGS  ARCHIVELOG

—-                       ^^^^^^^^^

RESETLOGS为无法使用online REDO文件时。

有RESETLOGS选项,制成控制文件时,需要添加USING BACKUP CONTROLFILE,执行数据库恢复。

顺序请参考Krown:39499。

 

B-3)nomount数据库。

—-

SQL> startup nomount

启动ORACLE实例。

Total System Global Area  135339844 bytes

Fixed Size                   454468 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

—-

 

B-4)执行已制成的控制文件的脚本。

—-

SQL> @create_cf.sql

制成控制文件。

—-

 

B-5)之前的 shutdown 通过 abort 选项,执行 recover 命令

—-

SQL> recover database;

—-

 

如果需要恢复的话。

这时,请执行B-7。

 

—-

SQL>recover database;

ORA-00283 由于故障,取消了恢复会话。

ORA-00264 不需要恢复。

—-

 

B-6)启动数据库

—-

SQL> alter database open;

变更数据库。

—-

 

B-7)CREATE CONTROLFILE语句中无法指定临时文件。

因此通过CREATE CONTROLFILE语句重新制成控制文件时,需要重新追加临时文件。

详细内容请参考Krown:66029。

 

通过trace 选项获得的控制文件的备份中,如下所示,会记录重新追加临时文件的命令。参考这个命令,追加临时文件。

 

—-

# Commands to add tempfiles to temporary tablespaces.

# Online tempfiles have complete space information.

# Other tempfiles may require adjustment.

ALTER TABLESPACE TEMP ADD TEMPFILE ‘D:\O920\ORADATA\ORA9204\TEMP.DBF’ SIZE 314572800 REUSE AUTOEXTEND OFF;

—-

参考控制文件的备份中记录的上述命令。

—-

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE ‘D:\O920\ORADATA\ORA9204\TEMP.DBF’ SIZE 314572800 REUSE AUTOEXTEND OFF;

变更表区域。

—-

 

由此,工作完成。

工作完成后,请制成备份。

另外,没有镜像化的话,请执行镜像化。

 

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号