oracle模拟故障-02 热备及恢复

v$recovery_log:在恢复时需要使用的归档日志信息,当一个数据文件需要恢复的时候,这里面才会有信息。

v$archived_log:包括所有的归档日志组信息。

v$recover_file:记录这所有需要被恢复的文件,是从控制文件得来的。要保证控制文件是最新的。

 

恢复命令:

在mount状态下,可以使用recover database或者recover datafile ‘/u01/oracle/guo/users01.dbf’;

在open状态下,可以使用recover tablespace users或者 recover datafile ‘/u01/oracle/guo/users01.dbf’;

 

建立测试环境:

创建一个表空间,增加一个用户;

建立一个表,插入一条数据,做次冷备份;

再插入一条记录,做次热备份;

再插入一条记录,手工切换联机重做日志文件;

 

1、创建一个表空间hckj(hckj01.dbf),创建一个用户usr1/usr1,建立一个表t,插入一条记录。

create tablespace hckj datafile '/u01/app/oracle/oradata/mdguo/hckj01.dbf’ size 10M extent management local uniform segment space management auto;

create user usr1 identified by usr1 default tablespace hckj;

grant connect,resource to usr1;

用usr1登录

create table t (id int,name varchar2(10));

insert into t values(0,’xue’);

commit;

2、做一次冷备

shutdown immediate

cp

3、用usr1登录,再增加一条记录:

insert into t values(1,’xue’);

commit;

4、做次热备

alter tablespace hckj begin backup;

把hckj01.dbf备份一份。cp到一个位置。

alter tablespace hckj end backup;

5、用usr1登录,再增加一条记录:

insert into t values(2,’yao’);

commit;

6、手工切换日志

alter system switch logfile;

 

环境搭建结束。

 

测试一、删除所有的数据文件,在数据库关闭的情况下完全恢复。

rm *。dbf

只有系统表空间或undo表空间发生故障,才需要在数据库关闭的情况下进行恢复。

步骤:

1、把冷备的文件cp回原位置,用冷备的文件加上archive文件就是删除前的文件。

步骤如下:

cp /u01/cold/*.dbf . #拷贝所有的dbf文件,到原位置。

2、登录数据库

sqlplus /nolog

conn /as sysdba

startup

3、查询哪些是需要恢复的文件

col error format a18

select * from v$recover_file;  #这里面显示的都是需要恢复的。

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
         1 ONLINE  ONLINE                         883189 24-NOV-11
         2 ONLINE  ONLINE                         883189 24-NOV-11
         3 ONLINE  ONLINE                         883189 24-NOV-11
         4 ONLINE  ONLINE                         883189 24-NOV-11
         5 ONLINE  ONLINE                         883189 24-NOV-11
         6 ONLINE  ONLINE                         883189 24-NOV-11
         7 ONLINE  ONLINE                         883189 24-NOV-11

4、进行恢复:

recover database;

SQL> recover database;  #一次性恢复所有。也可以使用recover datafile n;例如recover datafile 7;

ORA-00279: change 883189 generated at 11/24/2011 23:50:13 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_3_768088723.dbf
ORA-00280: change 883189 for thread 1 is in sequence #3

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

ORA-00279: change 883933 generated at 11/25/2011 00:46:29 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_4_768088723.dbf
ORA-00280: change 883933 for thread 1 is in sequence #4
ORA-00278: log file '/u01/arcbackup/1_3_768088723.dbf' no longer needed for
this recovery

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 883935 generated at 11/25/2011 00:46:31 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_5_768088723.dbf
ORA-00280: change 883935 for thread 1 is in sequence #5
ORA-00278: log file '/u01/arcbackup/1_4_768088723.dbf' no longer needed for
this recovery

Log applied.
Media recovery complete.

4、恢复结束,查询结果,全部数据已正常恢复。

SQL&gt; select * from usr1.t;

        ID NAME
---------- ----------
         1 wang
         0 xue
         2 yao

 

 

测试二、删除一个用户数据,在数据库打开的情况下恢复。

场景说明:数据库中,一个文件损坏,但其他还需正常工作,只能在数据库运行中进行恢复。

为了测试,我们在usr1中增加一条新纪录。

insert into t values(3,’zhang’);

commit;

alter system checkpoint;

步骤:

1、挂载数据库

正常情况下,文件损坏,自己是不知道的,我们直接startup

SQL&gt; startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              71304784 bytes
Database Buffers          209715200 bytes
Redo Buffers                2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: '/u01/app/oracle/oradata/mdguo/hckj01.dbf'

2、把损坏的数据离线,并打开数据库,是其他数据库正常工作。

SQL&gt; alter database datafile 7 offline;

SQL&gt; alter database open;

Database altered.

3、cp备份

[oracle@oral mdguo]$ cp /u01/cold/hckj01.dbf .

4、restore !

SQL&gt; recover datafile 7;

5、把新恢复的数据设为在线:

SQL&gt; alter database datafile 7 online;

Database altered.

6、测试 查询:

SQL&gt; select * from usr1.t order by 1;

        ID NAME
---------- ----------
         0 xue
         1 wang
         2 yao
         3 zhang

OK 恢复成功!!

 

 

 

测试三、数据文件损坏,但是没有备份。

前提:

1、不能是系统表空间,不能是老的控制文件。

2、数据库创建之后的所有的归档日志文件都在。

3、者控制文件里包含被损坏的文件的文件名(控制文件是当前的,或在损坏文件创建之后做的备份)。

 

环境搭建:

在创建一个新的表空间,在其上建立一个表,写入条记录。步骤同上,这里省略。

步骤:

1、把损坏的文件offline,

SQL&gt; col name format a56;
SQL&gt; select TS#,name from v$datafile;

       TS# NAME
---------- --------------------------------------------------------
         0 /u01/app/oracle/oradata/mdguo/system01.dbf
         1 /u01/app/oracle/oradata/mdguo/undotbs01.dbf
         2 /u01/app/oracle/oradata/mdguo/sysaux01.dbf
         4 /u01/app/oracle/oradata/mdguo/users01.dbf
         6 /u01/app/oracle/oradata/mdguo/example01.dbf
         7 /u01/app/oracle/oradata/mdguo/guo.dbf
        10 /u01/app/oracle/oradata/mdguo/hckj01.dbf
        11 /u01/app/oracle/oradata/mdguo/hckj02.dbf

8 rows selected.

关闭数据库,在打开,发现datafile文件号和上述查出来的不一样。

SQL&gt; startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              71304784 bytes
Database Buffers          209715200 bytes
Redo Buffers                2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/u01/app/oracle/oradata/mdguo/hckj02.dbf'

 

或者 按照上例子中方法,关闭数据库,再挂载让oracle自动发现,然后在离线,但是这两种方法的datafile文件号不一样的。

 

SQL&gt; alter database datafile 8 offline;

Database altered.

SQL&gt; alter database open;
Database altered.

2、重新创建一个空白的文件,名字和之前的一样

SQL&gt; alter database create datafile '/u01/app/oracle/oradata/mdguo/hckj02.dbf';

Database altered.

3、恢复

SQL&gt; recover datafile 8;
Media recovery complete.

4、使恢复的文件online。

SQL&gt; alter database datafile 8 online;

Database altered.

5、查询一下:

SQL&gt; select * from usr1.t2;

        ID NAME
---------- ----------
         1 yang

OK,恢复正常!

你可能感兴趣的:(oracle,database,信息,休闲,v)