oracle控制文件的恢复

控制文件包含数据库的结构信息,这些文件对数据库而言至关重要。如若丢失控制文件,则不能打开数据库。

控制文件的丢失分两种。第一种是部分控制文件丢失(只丢失了1个或者2个);另外一种是所有控制文件都丢失。

默认情况下,数据库会自动生成3个控制文件,但是会在同一目录下,本着数据安全的需求,强烈建议将3个控制文件放在不同的磁盘里。

移动控制文件的方法为:

SQL> alter system set control_files=

'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL',

'd:\ORACLE\ORCL\CONTROL02.CTL',

'e:\ORACLE\ORCL\CONTROL03.CTL'

scope=spfile;

因为控制文件和数据且文件一样,不能再联机状态下移动。故需要先shutdown 数据库,然后进行移动,最后Startup即可。

1.部分控制文件丢失后的恢复

同样的,先shutdown,然后删除一个控制文件CONTROL03.CTL ,重启数据库报错。

SQL> startup

ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance

ORACLE 例程已经启动。


Total System Global Area  778387456 bytes

Fixed Size                  1374808 bytes

Variable Size             260048296 bytes

Database Buffers          511705088 bytes

Redo Buffers                5259264 bytes

ORA-00205: ?????????, ??????, ???????

首先要解决的问题是ORA-00205:?????????, ??????, ???????

?表明字符集除了问题。解决方法如下:

SQL> Alter session setnls_language=american;

Session altered.

SQL> alter database mount;

alter database mount

ERROR at line 1:

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


隐刀数据库进入mount状态,报不能识别控制文件的错误。将现有的控制文件CONTROL01.CTL复制一份改名为CONTROL03.CTL


对恢复数据库提示没有进行mount状态。

SQL> recover database;

ORA-01507: database not mounte


启动数据库到mount状态下

SQL> alter database mount;

Database altered.

然后对恢复数据库

SQL> recover database;

ORA-00283: recovery session canceled due toerrors

ORA-00264: no recovery required

由于是正常关闭数据库进行的测试,数据库不需要执行恢复。

SQL> conn sys/oracle as sysdba;

已连接。

SQL> alter database open;

数据库已更改。

SQL> select * from global_name;

GLOBAL_NAME

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

ORCL

2.所有控制文件丢失后的恢复

2.1方法一:重新创建控制文件来恢复

用这种方法也有2种方式来实现,第一种是直接自己手动编写脚本来创建控制文件,但前提是对数据库的重做日志、数据文件的目录要非常清楚;另外一种方式是在数据库正常状态时,备份一下创建控制文件脚本到跟踪文件,这样创建控制文件的所有脚本信息都会很完整,就无需手工编写了,但前提自然是管理员要有觉悟,提前备份一份创建控制文件到trance文件。

我们直接测试第二种方式:

我们查看一下生成的trace文件的目录。

SQL> show parameter  user_dump_dest;

NAME            TYPE        VALUE

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

user_dump_dest     string     c:\app\administrator\diag\rdbms\orcl\orcl\trace


然后是备份创建控制文件的脚本到跟踪文件中

SQL> Alter database backup controlfileto trace;

数据库已更改。

我们关闭数据库,然后删除所有的控制文件。

然后是到c:\app\administrator\diag\rdbms\orcl\orcl\trace目录中寻找刚才生成有创建控制文件脚本的跟踪文件。经过一一寻找验证之后,发现是orcl_ora_3696.trc这个文件。(此处要注意:在实际环境下,应该是执行上述命令之后,立即保存到特定目录中已被恢复使用)。

接下来我们打开这个trace文件,可以找到相关的脚本信息:

STARTUP NOMOUNT

CREATE CONTROLFILE REUSEDATABASE "ORCL" NORESETLOGS ARCHIVELOG

   MAXLOGFILES 16

   MAXLOGMEMBERS 3

   MAXDATAFILES 100

   MAXINSTANCES 8

   MAXLOGHISTORY 292

LOGFILE

 GROUP 1 (

  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG',

   'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO01.LOG'

 ) SIZE 50M BLOCKSIZE 512,

 GROUP 2 (

  'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO02.LOG',

  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'

 ) SIZE 50M BLOCKSIZE 512,

 GROUP 3 (

   'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG',

  'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO03.LOG'

 ) SIZE 50M BLOCKSIZE 512

DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF',

 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM02.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX02.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS02.DBF',

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF'

CHARACTER SET ZHS16GBK;

执行之后会提示:控制文件已创建。此脚本还需注意开头部分的STARTUP NOMOUNT 命令,必须在nomount状态执行才能创建控制文件。


SQL> VARIABLE RECNO NUMBER;

SQL> EXECUTE :RECNO :=SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP

','ON');

PL/SQL 过程已成功完成。

此处是执行一个PL/SQL 的存储过程,目的是执行DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE包,让RMAN自动备份控制文件。

当然此处我们是手工备份与恢复,所以不进行如上操作也可以。

接下来我们就开始恢复数据库

SQL> recover database;

ORA-00283: recovery session canceled due toerrors

ORA-00264: no recovery required

此时根据提示可知,数据库无需恢复。

SQL> alter database open;

Database altered.

SQL> conn sys/oracle as sysdba;

已连接。

SQL> select * from global_name;

GLOBAL_NAME

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

ORCL

目前已是正常状态了。


方法二:通过备份的控制文件进行恢复

同样的,先shutdown,然后删除所有的控制文件,重启数据库报错。

SQL> startup

ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance

ORACLE 例程已经启动。

Total System Global Area  778387456 bytes

Fixed Size                  1374808 bytes

Variable Size             260048296 bytes

Database Buffers          511705088 bytes

Redo Buffers                5259264 bytes

ORA-00205: ?????????, ??????, ???????

先修改字符集的回话语言。

SQL> Alter session setnls_language=american;

Session altered.

SQL> alter database mount;

alter database mount

ERROR at line 1:

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


提示不能识别控制文件,这时所有的控制文件都已丢失,只能依靠备份的控制文件,将之前备份的控制文件CONTROL02.BAK改名复制到控制文件原目录中。


如若不知道3个控制文件的原目录,可以通过警告日志alertORCL.log来查看。

执行命令show parameter background_dump_dest,查看警告日志的目录。

SQL>show parameter background_dump_dest;

NAME                                 TYPE

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

VALUE

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

background_dump_dest                 string

c:\app\administrator\diag\rdbm

s\orcl\orcl\trace

打开警告日志,在最后看到如下信息:

Thu May23 17:12:21 2013

ORA-00210:cannot open the specified control file

ORA-00202:control file: 'C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL'

ORA-27041:unable to open file

OSD-04002:无法打开文件

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

ORA-00210:cannot open the specified control file

ORA-00202:control file: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL03.CTL'

ORA-27041:unable to open file

OSD-04002:无法打开文件

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

ORA-00210:cannot open the specified control file

ORA-00202:control file: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL'

ORA-27041:unable to open file

OSD-04002:无法打开文件

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

ORA-205signalled during: alter database mount...

由此可知;3个控制文件的目录。


改名复制完控制文件之后,启动数据库到mount状态,如后恢复。


SQL> recover database using backupcontrolfile

ORA-00911: invalid character

出现上述问题:原因是controlfile后面的分号是中文模式下输入导致的,千万注意!

恢复数据库

SQL> recover database;

ORA-00283: recovery session canceled due toerrors

ORA-01610: recovery using the BACKUPCONTROLFILE option must be done

由上可知必须使用控制文件恢复。

SQL> recover database using backupcontrolfile;

ORA-00279: change 2426235 generated at05/23/2013 14:31:12 needed for thread 1

ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000068_0806146542.0001

ORA-00280: change 2426235 for thread 1 isin sequence #68

Specify log: {<RET>=suggested |filename | AUTO | CANCEL}

Auto(此处可选择自动寻找归档日志)

ORA-00279: change 2433122 generated at05/24/2013 10:38:10 needed for thread 1

ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000069_0806146542.0001

ORA-00280: change 2433122 for thread 1 isin sequence #69

ORA-00278: log file'C:\ORACLE\ORCL\ARCH\ARC0000000068_0806146542.0001' no

longer needed for this recovery

ORA-00279: change 2435842 generated at05/24/2013 13:14:00 needed for thread 1

ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000070_0806146542.0001

ORA-00280: change 2435842 for thread 1 isin sequence #70

ORA-00278: log file'C:\ORACLE\ORCL\ARCH\ARC0000000069_0806146542.0001' no

longer needed for this recovery

再执行一次恢复命令

SQL> recover database using backupcontrolfile;

ORA-00279: change 2459108 generated at05/24/2013 13:50:09 needed for thread 1

ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000071_0806146542.0001

ORA-00280: change 2459108 for thread 1 isin sequence #71

Specify log: {<RET>=suggested |filename | AUTO | CANCEL}

C:\app\Administrator\oradata\orcl\REDO01.LOG(此处是提示要寻找标号为71的归档日志,但是打开归档日志目录发现最大的编号才是70,说明编号为71的归档信息还在redolog里面,指定正在使用的redolog目录即可。又因为目前不知道正在使用的redolog是哪个文件,此处是先从REDO01.LOG开始尝试)

ORA-00310: archived log contains sequence70; sequence 71 required

ORA-00334: archived log:'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'


SQL> recover database using backupcontrolfile;

ORA-00279: change 2459108 generated at05/24/2013 13:50:09 needed for thread 1

ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000071_0806146542.0001

ORA-00280: change 2459108 for thread 1 isin sequence #71

Specify log: {<RET>=suggested |filename | AUTO | CANCEL}

C:\app\Administrator\oradata\orcl\REDO02.LOG(尝试失败之后,换2号重做日志,提示成功)

Log applied.

Media recovery complete.

改变数据库为open状态:

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01589: must use RESETLOGS or NORESETLOGSoption for database open

提示错误:启动open状态必须设置参数RESETLOGS or NORESETLOGS

使用resetlogs 会导致归档日志的编号归零,重新从1开始编号。使用noresetlogs则不会打断原有的归档日志编号的顺序而继续编号。

SQL> alter database open noresetlogs;

alter database open noresetlogs

ERROR at line 1:

ORA-01588: must use RESETLOGS option fordatabase open

SQL> alter database open resetlogs;

Database altered.

经过测试发现,数据库恢复之后,只能通过resetlogs;启动数据库到open状态。

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance

ORACLE instance started.

Total System Global Area  778387456 bytes

Fixed Size                  1374808 bytes

Variable Size             260048296 bytes

Database Buffers          511705088 bytes

Redo Buffers                5259264 bytes

数据库装载完毕。

数据库已经打开。

SQL> archive log list;

数据库日志模式存档模式

自动存档启用

存档终点            c:\oracle\orcl\arch

最早的联机日志序列     1

下一个存档日志序列   1

当前日志序列           1

通过查看归档信息,发现归档日志编号确实已归零。