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下创建两个文件夹cold和hot。
冷备份,命令如下,
[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
---------- ------- -----