Oracle—用户管理的完全恢复(二)

在用户管理的完全恢复()中说明了在非归档模式下的完全恢复,下面说明在归档模式下的完全恢复。


一.在归档模式下的完全恢复

 

1.在归档模式下的完全恢复中,先是通过备份文件进行还原,然会通过日志文件(联机重做日志和归档日志文件)进行恢复。


2.在归档模式下的完全恢复中,哪个数据文件损坏,那么只要还原恢复这个文件即可,其它文件不受干扰继续运行,这点与非归档模式不同。


3.还原恢复一个数据文件,这个文件必须处于offline状态。


二.完全恢复的方式

1.在数据库打开的状态时,数据文件丢失或者损坏,需要关闭数据库来恢复。——主要是应对于当系统表空间和undo表空间有问题时。


2.在在数据库打开的状态时,数据文件丢失或者损坏(非系统表空间和undo表空间里的文件),在数据库打开时怎么恢复。


3.数据库在关闭状态文件损坏(不能是系统表空间中的文件),业务需求要先打开数据库,再进行恢复。


4.数据文件没有备份,但是丢失了,怎么使用联机重做日志和归档日志文件进行恢复。


三.准备工作


    下面主要实验上面说明的四种情况,先做一下准备工作,为了方便不备份整个数据库了,改为备份一个表空间。需要做的如下,

一个表空间app1,一个用户Dave,一个表(测试表),一个冷备份,一个热备份。


1.创建一个表空间app1,命令如下,


SQL> create tablespace app1 datafile '/u01/oradata/wilson/app1_01.dbf' size 100M  

  2  extent management local uniform

  3  segment space management  auto;

Tablespace created.


2.创建一个用户


SQL> create  user Dave identified by Dave_12345

  2  default tablespace app1;

User created.


SQL> grant connect,resource to  Dave;

Grant succeeded.


3.打开另一个会话,以用户Dave登录,创建表,插入数据


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

Table created.


SQL> insert into t values(0,'Dave.Sun');

1 row created.


SQL> commit;

Commit complete.


4.冷备份和热备份


在目录/u01/ubackup下创建两个文件夹coldhot

冷备份,命令如下,

[oracle@oracle11g cold]$ cp   /u01/oradata/wilson/*  /u01/ubackup/cold/


热备份,以用户Dave登录,再插入一行数据,

SQL> insert into t values(1,'sunshine');

1 row created.


开始热备份,以sys用户登录,命令如下,

SQL> alter tablespace app1 begin backup;

Tablespace altered.


SQL> !cp  /u01/oradata/wilson/app1_01.dbf  /u01/ubackup/hot


SQL> alter tablespace app1 end  backup;

Tablespace altered.


5.在表Dave.t下,插入一条数据让它存放在归档日志中,但是它没有备份;

在用户Dave下,


SQL> insert into t values(2,'sunny');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from t;

        ID NAME

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

         0 Dave.Sun

         1 sunshine

         2 sunny


这条数据存放在联机重做日志中了,


在用户sys下,


SQL> alter system switch logfile;

System altered.


即将这条数据存放在归档日志中了。


总结一下,在冷备份下有一行数据在数据文件app1_01.dbf中,在热备下有两行数据在该数据文件下,在归档日志文件中有三行数据。


四.实验一

   在数据库打开的状态时,数据文件丢失或者损坏,需要关闭数据库来恢复。——主要是应对于系统表空间和undo表空间有问题时。在系统文件有损坏时,数据库不能打开,必须关闭数据库来恢复。


1.打开数据库,删除/u01/oradata/wilson下的app1_01.dbf数据文件和系统文件system01.dbf(模拟文件损坏或丢失),命令如下,

[oracle@oracle11g wilson]$ rm  -f    /u01/oradata/wilson/ app1_01.dbf 

[oracle@oracle11g wilson]$ rm  -f    /u01/oradata/wilson/ system01.dbf 

关闭数据库。


2.把冷备份的数据文件复制到/u01/oradata/wilson/的目录中,


[oracle@oracle11g wilson]$ cp   /u01/ubackup/cold/app1_01.dbf  /u01/oradata/wilson/

[oracle@oracle11g wilson]$ cp   /u01/ubackup/cold/system01.dbf  /u01/oradata/wilson/

这个时候还原回来的数据文件和控制文件是不一致的,所以打开数据库时只会进入mount状态。


3.查看视图v$recover_file


SQL> select *  from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR        CHANGE# TIME

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

         1 ONLINE  ONLINE                3003034 30-AUG-13

        12 ONLINE  ONLINE                3003034 30-AUG-13


这个动态性能视图给出了哪些数据文件需要,可以看到文件号。


4.使用recover命令来恢复文件,


SQL> recover datafile 1;

Media recovery complete.


SQL> recover datafile 12;

Media recovery complete.


或者使用recover database;


可以再查看一下 视图v$recover_file已经没有内容了,

SQL> select *  from v$recover_file;

no rows selected


5.打开数据库,查看表Dave.t的内容是否恢复,


SQL> alter database open;

Database altered.


SQL> select *  from Dave.t;

        ID NAME

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

         0 Dave.Sun

         1 sunshine

         2 sunny

可以看到表Dave.t中的数据已经恢复回来了。


五.实验二

在数据库打开的状态时,数据文件丢失或者损坏(非系统表空间和undo表空间里的文件),在数据库打开时怎么恢复。


1.在表Dave.t中插入一行数据,备份中是不含有这条记录的,1如下,


SQL> insert into t values(3,'wound');

1 row created.


SQL> commit;

Commit complete.

切换日志,可以将内存中的数据写入数据文件中和把当前联机重做日志文件进行归档。


SQL> alter system  switch logfile;

System altered.


2.将数据文件app1_01.dbf 删除,然后查看视图v$recover_file,


[oracle@oracle11g wilson]$ rm   -f   app1_01.dbf 


SQL> select *  from v$recover_file;


     FILE# ONLINE  ONLINE_ ERROR     CHANGE# TIME

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

        12 OFFLINE OFFLINE FILE NOT FOUND          0


可以看到12号文件已经not found了,关于12号文件的文件名是什么,可以查看视图v$datafile;


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

     FILE# NAME

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

         1 /u01/oradata/wilson/system01.dbf

         2 /u01/oradata/wilson/sysaux01.dbf

         3 /u01/oradata/wilson/undotbs01.dbf

         4 /u01/oradata/wilson/users01.dbf

         5 /u01/oradata/wilson/example01.dbf

         8 /u01/oradata/wilson/smallundo1.dbf

        12 /u01/oradata/wilson/app1_01.dbf

7 rows selected.


3.恢复数据文件,因为正在打开数据库的状态下,所以先要将有问题的数据文件offline

SQL> alter database  datafile 12 offline;

Database altered.

或者使用文件名也行。


4.将备份的数据文件复制到/u01/oradata/wilson下(还原数据文件),


[oracle@oracle11g wilson]$ cp /u01/ubackup/hot/app1_01.dbf  /u01/oradata/wilson/

如果是复制到新的目录下,那么还需要如下命令,

alter database rename file ‘........’ to ‘.........’;来修改控制文件。


5.恢复数据文件,将其状态改为online


SQL> recover datafile 12;

Media recovery complete.


SQL> alter database datafile 12 online;

Database altered.


6.查看表Dave.t中的数据是否恢复,


SQL> select *  from  Dave.t order by 1;

        ID NAME

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

         0 Dave.Sun

         1 sunshine

         2 sunny

         3 wound

可以看到数据已经恢复了。


六.实验三

   数据库在关闭状态文件损坏(不能是系统表空间中的文件),业务需求要先打开数据库,再进行恢复。


1.先打开数据库,在表Dave.t中添加一行数据,新添加的数据在原先备份中是没有的,把这些数据放到归档日志文件或者联机重做日志文件中,最后查看是否恢复了。

SQL> insert into t values(4,'mm');

1 row created.


SQL> commit;

Commit complete.


把当前联机重做日志文件归档,

SQL> alter system archive log  current;

System altered.


2.关闭数据库,模拟损坏app1_01.dbf文件,


[oracle@oracle11g wilson]$ rm  -f   app1_01.dbf (模拟损坏文件)


这个时候可以在数据库关闭的情况下恢复这个数据文件,但是现在因为业务要求,需要先打开数据库,


3.打开数据库,自动进入了mount状态了,查看视图v$recover_file,


SQL> select  * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME

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

        12 ONLINE  ONLINE  FILE NOT FOUND              0


可以看到12号文件是not found了,同样也可以查看视图v$datafile来找到文件名。


4.先将12号文件offline,然后直接打开数据库


SQL> alter database datafile 12 offline;

Database altered.


SQL> alter database open;

Database altered.


现在数据库可以使用了,但是不能访问有损坏的数据文件。


5.恢复数据文件,查看表Dave.t中的数据是否恢复,


还原数据文件

[oracle@oracle11g wilson]$ cp /u01/ubackup/cold/app1_01.dbf  /u01/oradata/wilson/


恢复数据文件

SQL> recover datafile 12;

Media recovery complete.


把数据文件状态改为online,

SQL> alter database datafile 12 online;

Database altered.


查看表Dave.t中的数据,
SQL> select *  from  Dave.t order by 1;

        ID NAME

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

         0 Dave.Sun

         1 sunshine

         2 sunny

         3 wound

         4 mm


可以看到在备份中的数据和在联机重做日志文件或者归档日志文件中的数据都已经恢复了。


七.实验四

     数据文件没有备份,但是丢失了,怎么使用联机重做日志和归档日志文件进行恢复。

这样的情况下,有几个条件需要满足才能完成恢复:


(1)数据文件不能是系统表空间中的文件,因为重做日志不能应用于它。


(2)在这个数据文件创建之后,所有的归档日志文件都在。


(3)在数据文件损坏后,控制文件没有重新创建,还包含着被损坏文件的文件名。


1.先创建个表空间和数据文件,然后在用户Dave下创建表和插入数据,


SQL> create tablespace app2 datafile '/u01/oradata/wilson/app2_01.dbf' size 10m;

Tablespace created.


在Dave用户下,

SQL> create table t2 (id int,name char(10))  tablespace app2;

Table created.


SQL> insert into t2 values(0,'Dave');

1 row created.

SQL> commit;

Commit complete.


让内存中的数据写到数据文件中,

SQL> alter system checkpoint;

System altered.


即表t2中的数据写到了app2_01.dbf数据文件上。


2.删除app2_01.dbf数据文件,模拟文件损坏,


[oracle@oracle11g wilson]$ rm   -f    app2_01.dbf 

查看视图v$recover_file会看到没有记录,怎么回事?


SQL> select * from  v$recover_file;

no rows selected


这是因为数据库还没有发现有文件丢失,等到要使用这个数据文件时才能发现。


等一会发现,

SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR      CHANGE# TIME

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

         6 OFFLINE OFFLINE FILE NOT FOUND              0


再通过视图v$datafile可以看到6号文件对应的数据文件名。


3.将有问题的数据文件offline,然后从新创建一个,

SQL> alter  database datafile 6 offline;

Database altered.


新建个app2_01.dbf数据文件,这个时候这个文件还是空的,

SQL> alter database create datafile '/u01/oradata/wilson/app2_01.dbf';

Database altered.


4.恢复文件,查看结果


SQL> recover datafile 6;

Media recovery complete.


SQL> alter database datafile 6 online;

Database altered.


SQL> select * from Dave.t2;

        ID NAME

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

         0 Dave


可以看到完成了数据恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值