用户管理的和基于RMAN的不完全恢复
执行不完全的数据库恢复操作,需要理解重做日志和archivelog进程/oracle数据库的同步和允许执行不完全恢复使用的选项.
不完全恢复是出现某些类型的错误时,唯一可以使用的恢复方法.理解何时以及怎样使用不完全恢复方法是很重要的.在任何时候,只要出现了一个可以导致你不能恢复到改变以前的数据库状态的错误,就需要使用下面几种不完全恢复方法之一.
Cancel:基于删除的不完全介质恢复;
Time:基于时间的不完全介质恢复;
Change:基于变化的不完全介质恢复.
每一个选项都可以恢复到出错的那一刻.出现三种选项的主要原因是,如果有三个选项的话,DBA就会有更大的灵活性,并且在恢复过程中能够控制到何处停止恢复.在下面的部分中,讲详细地描述每一个选项.
只要不想把所有的在线和归档日志文件都应用到数据库中,在任何时间都可以执行不完全恢复.
可能会需要这种类型恢复的情况是:数据文件损坏,重做日志损坏,或者由于用户的错误丢失了一个表.
有些情况下只能执行不完全恢复.如果是由于当前的,不活动的,非归档重做日志文件的损坏或者丢失引起的错误,就不能使用这些文件中的事务对数据库进行恢复.相反,如果执行了完全的恢复,恢复过程的结果就是再一次引入错误.
基于删除的恢复
这种恢复提供的灵活性最小,并且控制恢复过程中停止点的能力也最小.这里,恢复过程需要使用档案日志,在完成恢复之前的某点输入cancel命令,在这一点恢复就会停止,并且不会再使用更多的档案日志.
下面是执行基于删除的不完全恢复所需要的步骤:
1. 确保数据库是使用sqlplus中的shutdown命令关闭的(包括四种类型的shutdown);
2. 确保”当前的”数据文件/控制文件/参数文件存在副本(恢复前备份当前的数据库文件).万一出现错误,只要这些文件存在,就可以重新启动恢复过程,如果需要的话,还可以不引入任何新的错误,而这些错误在以前的错误恢复过程中可能会引入.
3. 确保备份文件存在.
4. 把数据文件从备份位置恢复到正确的位置.
5. 启动mount模式下的数据库.
6. 确保要恢复的数据文件都是联机的.select file#,status,enabled,name frm v$datafile;
7. recover database [using backup controlfile] until cancel;
8. alter database open resetlogs; 选项resetlogs用于确保用在恢复过程中的日志文件永远不能再被其他的任何操作使用.因为reseglogs会重新设置日志文件顺序并重建现存的联机重做日志.resetlogs不断地删除存在于非归档日志文件中的事务.同时,这个过程还使日志文件和数据文件/控制文件保持同步,如果没有清除这些事务的话,日志文件就会创建错误的档案日志.这就是执行不完全恢复之前,需要给控制文件/数据文件和重做日志文件做一个备份的原因,一旦出错,可以用备份的文件重启恢复过程.
9. 重新执行数据库的冷备份或完全热备份,现存的备份不在有效,需要清除.
基于时间的恢复
在这种类型的恢复中,dba将数据库恢复到出错前的那一点.这比基于删除的恢复有更大的灵活性和控制能力.基于删除选项的粒度就是重做日志文件的大小;一旦你应用了某个重做日志文件,就会获得该文件中的所有事务.而不管填满那个日志所需要的时间,如果你选择auto,则会导致应用所有的归档日志文件.
在基于时间的恢复中,把档案日志应用到数据库的指定点上,这一点如果在档案日志的前半部分,则没有必要应用整个的档案日志.
使用基于时间的恢复步骤和基于删除的恢复步骤一样,只是需要在第7步将代码稍做修改如下:recover database using backup controlfile until time ‘2009-02-27 10:37’;
下面我们来作个测试,在删除某个表之后,使用基于时间的恢复完成数据库的不完全恢复过程.
1,确保数据库是使用sqlplus中的shutdown命令关闭的(包括四种类型的shutdown);
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
2,对数据库执行冷备,备份所有的数据文件,控制文件,和在线日志文件
$ cp *.dbf backup1
$ cp *.ctl backup1
$ cp *.LOG backup1
3,启动数据库,创建一个表,在插入数据后记录时间点,删除该表
SQL> startup
ORACLE instance started.
Total System Global Area 1511484856 bytes
Fixed Size 736696 bytes
Variable Size 553648128 bytes
Database Buffers 956301312 bytes
Redo Buffers 798720 bytes
Database mounted.
Database opened.
SQL> create table mytable(f1 varchar2(2));
Table created.
SQL> alter system switch logfile;
System altered.
SQL> insert into mytable
2 select 21 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into mytable
2 select 22 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into mytable
2 select 23 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into mytable
2 select 24 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into mytable
2 select 25 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL>
SQL>
SQL>
SQL>
SQL> select * from mytable;
F1
----
21
22
23
24
25
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2009-02-27 10:54:55
SQL> drop table mytable;
Table dropped.
SQL> alter system switch logfile;
System altered.
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
4,确保”当前的”数据文件/控制文件/参数文件存在副本(恢复前备份当前的数据库文件).万一出现错误,只要这些文件存在,就可以重新启动恢复过程,如果需要的话,还可以不引入任何新的错误,而这些错误在以前的错误恢复过程中可能会引入.
$ mv *.dbf backup1
$ ls
REDO1_01.LOG REDO2_01.LOG ant backup_datafile control02.ctl lost+found
REDO1_0101.LOG REDO2_02.LOG backcopies bea control03.ctl tmp
REDO1_0102.LOG REDO3_01.LOG backup bea80 directory.out
REDO1_02.LOG REDO3_02.LOG backup1 control01.ctl file
$
$
$ mv *.ctl backup1
$ cp *.LOG backup1
5,确保备份文件存在.
$ cd backcopies
$
$ ls
CTL01.dbf OD01.dbf REDO1_02.LOG REDO3_02.LOG control01.ctl drsys01.dbf temp01.dbf
FBI.dbf REDO1_01.LOG REDO2_01.LOG RPTD01.dbf control02.ctl example01.dbf tools01.dbf
HAPPYTREE.dbf REDO1_0101.LOG REDO2_02.LOG RPTI01.dbf control03.ctl indx01.dbf undotbs03.dbf
HTEC.dbf REDO1_0102.LOG REDO3_01.LOG TEMP1_01.dbf cwmlite01.dbf system01.dbf users01.dbf
6,把数据文件从备份位置恢复到正确的位置.
$ cp *.dbf /oradata
$ pwd
/oradata/backcopies
$ cp *.ctl /oradata
7,启动mount模式下的数据库.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1511484856 bytes
Fixed Size 736696 bytes
Variable Size 553648128 bytes
Database Buffers 956301312 bytes
Redo Buffers 798720 bytes
Database mounted.
8,recover database [using backup controlfile] until time ‘2009-02-27 10:54:55’;
SQL> recover database until time '2009-02-27 10:54:55';
Media recovery complete.
SQL>
SQL>
SQL>
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
9,重新执行数据库的冷备份或完全热备份,现存的备份不在有效,需要清除.
用户或者会发现,如果执行上面的测试,我们并没有办法恢复已经删除的表数据,这是因为我们对一个不需要recover的表进行了recover,所以until 操作并不会生效.
基于变化(SCN)的恢复
在基于变化的恢复中,需要恢复到出错前的SCN(system change number),这种类型的恢复,可以进行控制的方面更多.SCN是oracle中用来唯一标识每一个提交事务的工具,scn是一个号码,它顺序排列每个重做日志中出现的每一个事务.在反转段/控制文件和数据文件的事务表中,也有对这个号码的记录(用户可以使用LOGMNR查看得到需要恢复到的SCN).SCN用来调节这些事务和这些文件与数据库的同步,使之处于统一的状态.
每一个重做日志与一个低的和高的SCN相关联,在v$log_history视图下可以看到这些SCN信息.
通过使用until change scn可以完成一个基于变化的不完全恢复.
小结:
使用不完全恢复,可以把数据库恢复到数据库出错前的那一刻,或者是恢复到出错前最后一个可用的事务.换句话说,这种恢复类型的结果是,恢复后的数据库丢失了事务,所以叫不完全恢复.
可能有很多原因,使得你不得不执行数据库的不完全恢复.比如数据库系统瘫痪或者丢失了数据库对象.这意味着,在恢复过程中需要停止使用可用的档案日志.如果不停止的话,可能会把错误重新引入到数据库中,因为从档案重做日志中重新读入了错误的事务.
另一种需要执行不完全恢复的情况是,数据库丢失了当前的重做日志文件,这种错误只能使用不完全恢复解决问题.
不完全恢复是恢复某些类型的错误的关键方法,为了对测试进行更充分的准备,必须理解这些概念.在日常维护中,比如要把数据库从一个服务器转移到另外一个服务器时也可以使用这些概念.