模拟ORA-01207异常

一、环境准备

1、备份oradata/orcl目录下的所有文件:redo日志,控制文件,数据文件

2、启动数据库,创建表空间

startup

create tablespace test datafile 'D:\app\Administrator\oradata\orcl\test.dbf' size 10M;

3、关闭数据库,将备份的控制文件复制到/oradata/orcl/目录下

二、解决方案:

方案一、完全恢复:

1、启动数据库,出现ORA-01207错误

startup

ORA-01122: 数据库文件 1 验证失败

ORA-01110: 数据文件 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF'

ORA-01207: 文件比控制文件更新 - 旧的控制文件

2、重建控制文件:

alter database backup controlfile to trace as 'C:\trace';

3、关闭数据库:shutdown immediate

4、将数据库启动到nomount状态:startup nomount;

5、打开'C:\trace'文件,在数据库命令行种执行下面的语句,重建控制文件

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG

   MAXLOGFILES 16

   MAXLOGMEMBERS 3

   MAXDATAFILES 100

   MAXINSTANCES 8

   MAXLOGHISTORY 9180

LOGFILE

 GROUP 1 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,

 GROUP 2 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,

 GROUP 3 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512

DATAFILE

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

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

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

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

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

CHARACTER SET ZHS16GBK;

6、恢复数据库

recover database;

7、打开数据库

alter database open;

8、重建临时表空间

ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF' REUSE;

9、日志切换,对数据库进行全备

alter system switch logfile;

backup database;



方案二、不完全恢复

1、启动数据库,出现ORA-01207错误

startup

ORA-01122: 数据库文件 1 验证失败

ORA-01110: 数据文件 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF'

ORA-01207: 文件比控制文件更新 - 旧的控制文件

2、重建控制文件:

alter database backup controlfile to trace as 'C:\trace';

3、关闭数据库:shutdown immediate

4、将数据库启动到nomount状态:startup nomount;

5、打开'C:\trace'文件,在数据库命令行种执行下面的语句,重建控制文件

CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  NOARCHIVELOG

   MAXLOGFILES 16

   MAXLOGMEMBERS 3

   MAXDATAFILES 100

   MAXINSTANCES 8

   MAXLOGHISTORY 9180

LOGFILE

 GROUP 1 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,

 GROUP 2 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,

 GROUP 3 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG'  SIZE 50M BLOCKSIZE 512

DATAFILE

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

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

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

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

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

CHARACTER SET ZHS16GBK;

6、恢复数据库

RECOVER DATABASE USING BACKUP CONTROLFILE;

输入日志路径

7、打开数据库

alter database open resetlogs;

8、重建临时表空间

ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF' REUSE;

9、日志切换,对数据库进行全备

alter system switch logfile;

backup database;



方案三、不完全恢复-不重建控制文件

1、将数据库启动到mount状态

startup mount;

2、恢复数据库信息:

recover database using backup controlfile;

输入当前redo日志的路径

3、出现错误:

ORA-00283: recovery session canceled due to errors

ORA-01244: unnamed datafile(s) added to control file by media recovery

ORA-01110: data file 6: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST.DBF'

ORA-01112: 未启动介质恢复

4、使用alter database create datafile重建数据文件

alter database create datafile 6 as 'D:\app\Administrator\oradata\orcl\test.dbf';

5、继续恢复数据库信息:

recover database using backup controlfile;

输入当前redo日志的路径

6、打开数据库

alter database open resetlogs;

7、重建临时表空间

ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF' REUSE;

8、日志切换,对数据库进行全备

alter system switch logfile;

backup database;



备注:

备注一、alter database open resetlogs含义

alter database open resetlogs是要打开数据时,重置重做日志,即将重做日志的sequence置零,为什么要重置重做日志呢?不完全恢复后,原来的online redo log里面包含的是未做恢复前的数据,而这些数据对于恢复后的数据库不再有效,所以数据库会要求在Open之前先对online redo log的sequence置零。

Resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始,每次使用Resetlogs命令的时候,SCN不会被重置,不过oracle会重置日志序列号,而且会重置联机重做日志内容。

Oracle把这个数据库逻辑生存期称为incarnation。每次使用resetlogs打开数据库,就会使incarnation + 1,也就是产生一个新的incarnation;如果想要恢复到之前incarnation的scn/time,就需要先恢复到之前的incarnation;

备注二、四种recover database恢复区别

1. recover database using backup controlfile

如果丢失当前控制文件,用冷备份的控制文件恢复的时候,用来告诉oracle,不要以controlfile中的scn作为恢复的终点;

2. recover database until cancel

如果丢失current/active redo的时候,手动指定终点。

3. recover database using backup controlfile until cancel;

如果丢失当前controlfile并且current/active redo都丢失,会先去自动应用归档日志,可以实现最大的恢复;

4. recover database until cancel using backup controlfile;

如果丢失当前controlfile并且current/active redo都丢失,以旧的redo中的scn为恢复终点。因为没有应用归档日志,所有会丢失数据。

要理解recover database using backup controlfile,先理解 recover database,也就是说,不加using backup controlfile的情况。

在普通的recover database 或者 recover tablespace, recover datafile时, Oracle会以当前controlfile所纪录的SCN为准,利用archive log和 redo log的redo entry, 把相关的datafile 的 block恢复到"当前controlfile所纪录的SCN"

而某些情况下,Oracle需要把数据恢复到比当前controlfile所纪录的SCN还要靠后的位置(比如说,control file是backup controlfile,或者controlfile是根据trace create的。),这时候,就需要用using backup controlfile.恢复就不会受"当前controlfile所记录的SCN"的限制。这时候的限制就来自于你的语句(until time,until scn),或者可用的archive log(until cancel);