1、恢复过程查看的试图:

1)v$recovery_file:查看需要恢复的datafile

2)v$recovery_log:查看recover需要的redo日志

3)v$archived_log:查看已经归档的日志

2、手工完全恢复

实验一:所有数据文件和控制文件都丢失

1)先将控制文件dump到trace中

SQL> alter database backup controlfile to trace as '/u01/app/oracle/admin/EMREP/udump/haha.trc';

2)创建实验表

SQL> create table emp1 as select * from scott.emp;

插入数据提交并归档

SQL> insert into emp1 select * from scott.emp;
SQL> commit;
SQL> alter system archive log current;

插入数据只提交
SQL> insert into emp1 select * from scott.emp;
SQL> commit;

不提交不归档
SQL> insert into emp1 select * from scott.emp;

 

3)模拟断电,破会数据文件和控制文件

SQL> shutdown abort

[oracle@gc2 hot_bak]$ cd /u01/app/oracle/oradata/EMREP/
[oracle@gc2 EMREP]$ ls
control01.ctl  example01.dbf     redo01.log  sysaux01.dbf  undotbs01.dbf
control02.ctl  gguser.dbf        redo02.log  system01.dbf  users01.dbf
control03.ctl  goldengate01.dbf  redo03.log  temp01.dbf
[oracle@gc2 EMREP]$ rm *.dbf
[oracle@gc2 EMREP]$ rm *.ctl

 

4)启动数据库失败

SQL> startup
ORACLE instance started.
Total System Global Area  608174080 bytes
Fixed Size                  1220844 bytes
Variable Size             197136148 bytes
Database Buffers          406847488 bytes
Redo Buffers                2969600 bytes
ORA-00205: error in identifying control file, check alert log for more info

 

5)恢复解决:

(1)重建控制文件,因为日志没有丢失,所以这里用NORESETLOGS

[oracle@gc2 udump]$ more haha.trc

CREATE CONTROLFILE REUSE DATABASE "EMREP" NORESETLOGS FORCE LOGGING ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/EMREP/redo01.log'  SIZE 50M,
  GROUP 2 '/u01/app/oracle/oradata/EMREP/redo02.log'  SIZE 50M,
  GROUP 3 '/u01/app/oracle/oradata/EMREP/redo03.log'  SIZE 50M
-- STANDBY LOGFILE

DATAFILE
  '/u01/app/oracle/oradata/EMREP/system01.dbf',
  '/u01/app/oracle/oradata/EMREP/undotbs01.dbf',
  '/u01/app/oracle/oradata/EMREP/sysaux01.dbf',
  '/u01/app/oracle/oradata/EMREP/users01.dbf',
  '/u01/app/oracle/oradata/EMREP/example01.dbf',
  '/u01/app/oracle/oradata/EMREP/goldengate01.dbf',
  '/u01/app/oracle/oradata/EMREP/gguser.dbf'
CHARACTER SET WE8ISO8859P1
;

重建报错,我们需要先转储备份的数据文件

[oracle@gc2 hot_bak]$ cp * /u01/app/oracle/oradata/EMREP/

[oracle@gc2 hot_bak]$ cp control01.ctl /u01/app/oracle/oradata/EMREP/control01.ctl
[oracle@gc2 hot_bak]$ cp control01.ctl /u01/app/oracle/oradata/EMREP/control02.ctl
[oracle@gc2 hot_bak]$ cp control01.ctl /u01/app/oracle/oradata/EMREP/control03.ctl

再次重建成功;

查看scn号发现不一致

SQL> select file#,checkpoint_change# from v$datafile;
         1             998993
         2             998993
         3             998993
         4             998993
         5             998993
         6             998993
         7             998993
SQL> select file#,checkpoint_change# from v$datafile_header;
         1             998253
         2             998289
         3             998313
         4             998340
         5             998360
         6             998384
         7             998410

需要恢复数据库

SQL> recover database;
Media recovery complete.
SQL> alter database open;

SQL> select count(*) from emp1;
        42

数据恢复到最后一次提交。

 

实验二:只有数据文件丢失了

1)创建实验环境

SQL> create table emp2 as select * from scott.emp;
SQL> insert into emp2 select * from scott.emp;
SQL> commit;
SQL> alter system archive log current;
SQL> insert into emp2 select * from scott.emp;
SQL> commit;
SQL> insert into emp2 select * from scott.emp;
SQL> select count(*) from emp2;
        56

 

2)模拟断电,破坏试验

SQL> shutdown abort
ORACLE instance shut down.

删除所有的数据文件

[oracle@gc2 EMREP]$ ls
control01.ctl  example01.dbf     redo01.log  sysaux01.dbf   users01.dbf
control02.ctl  gguser.dbf        redo02.log  system01.dbf
control03.ctl  goldengate01.dbf  redo03.log  undotbs01.dbf
[oracle@gc2 EMREP]$ rm *.dbf

3)启动失败

SQL> startup
ORACLE instance started.
Total System Global Area  608174080 bytes
Fixed Size                  1220844 bytes
Variable Size             197136148 bytes
Database Buffers          406847488 bytes
Redo Buffers                2969600 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/EMREP/system01.dbf'

查看需要恢复的数据文件

SQL> select file#,error from v$recover_file;
         1 FILE NOT FOUND
         2 FILE NOT FOUND
         3 FILE NOT FOUND
         4 FILE NOT FOUND
         5 FILE NOT FOUND
         6 FILE NOT FOUND
         7 FILE NOT FOUND

SQL> select file#,name from v$datafile;

         1 /u01/app/oracle/oradata/EMREP/system01.dbf
         2 /u01/app/oracle/oradata/EMREP/undotbs01.dbf
         3 /u01/app/oracle/oradata/EMREP/sysaux01.dbf
         4 /u01/app/oracle/oradata/EMREP/users01.dbf
         5 /u01/app/oracle/oradata/EMREP/example01.dbf
         6 /u01/app/oracle/oradata/EMREP/goldengate01.dbf
         7 /u01/app/oracle/oradata/EMREP/gguser.dbf

转储备份:

[oracle@gc2 hot_bak]$ cp *.dbf /u01/app/oracle/oradata/EMREP/

恢复:

SQL> recover database;
ORA-00279: change 998253 generated at 07/27/2014 13:20:11 needed for thread 1
ORA-00289: suggestion : /home/oracle/EMREP/1_23_839513627.dbf
ORA-00280: change 998253 for thread 1 is in sequence #23


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto            ---让系统自己找需要的日志
Log applied.
Media recovery complete.
SQL> alter database open;
SQL> select count(*) from emp2;
        42

数据恢复到最后一次的提交。