不完全恢复分为用户不完全恢复和RMAN不完全恢复。若联机重做日志文件或者归档日志文件有丢失,则只能进行不完全恢复。
一.不完全恢复的分类
1.time recover选项,指定恢复到某个时间点,常用。
2.cancel recover选项,停止在某个日志切换序列号处,通常只在归档日志文件受损或丢失的情况下使用,从而无法进一步恢复。
3.change-base recover选项,指定到某个SCN号。
4.在所有情况下都将恢复到恰好在请求的停止点之前的变更向量,比如将不会应用到指定的SCN。
二.执行不完全恢复的步骤
1.关闭和备份数据库或者某些数据文件;
2.加载数据库。
3.还原数据文件(必要时还原控制文件);
4.将数据库恢复到某个时间点;
5.使用重置日志(resetlog)打开数据库。
三.基于时间的恢复
指定到某个时间点,但是要注意其时间的格式是不允许改变的,无论在SQL*PLUS会话中如何设置它的NLS_DATE_FORMAT ,日期必须是yyyy-mm-dd:hh24:mi:ss。
1.在用户Dave下创建个表sunny,插入数据,
SQL> create table sunny (id int,name char(10)) tablespace app1;
Table created.
SQL> insert into sunny values(0,'baby');
1 row created.
SQL> commit;
Commit complete.
手动发生检查点,
SQL> alter system checkpoint;
System altered.
这样数据写进了数据文件app1_01.dbf。
2.关闭数据库,对app1_01.dbf数据文件做个备份,插入新的数据
备份数据文件,
[oracle@oracle11g wilson]$ cp app1_01.dbf /u01/ubackup/cold
打开数据库,插入新数据
SQL> insert into sunny values(1,'Jasper');
1 row created.
SQL> commit;
Commit complete.
查看当前时间,
SQL> select to_char(sysdate,'DD-MON-YYYY HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'DD-MON-YYYYH
-----------------------------
04-SEP-2013 12:52:34
3.删除表,再恢复回来,
SQL> drop table sunny;
Table dropped.
关闭数据库,删除数据文件,再还原备份的数据文件(这个文件中不含有新的数据),
[oracle@oracle11g wilson]$ rm -f app1_01.dbf
还原数据文件,
[oracle@oracle11g backup]$ cp /u01/backup/app1_01.dbf /u01/oradata/wilson/
4.将数据库置于mount状态,恢复表
SQL> recover database until time '2013-09-04:12:52:22';
Media recovery complete.
指定时间点,打开数据库,
SQL> alter database open resetlogs;
即可。
四.基于cancel的恢复
1.关闭数据库,备份数据库,命令如下,
[root@oracle11g wilson]# cp /u01/oradata/wilson/* /u01/ubackup/cold/
2.打开数据库,在表Dave.sunny中插入数据,
SQL> insert into sunny values(3,'memory');
1 row created.
SQL> commit;——————数据存于联机重做日志中
Commit complete.
SQL> alter system checkpoint;——————数据存于数据文件中
System altered.
SQL> alter system archive log current;——————数据存于归档日志中
System altered.
可以看到记录(3,‘memory’)存于数据文件,联机重做日志文件和归档日志文件中。
3.插入新数据,不放在归档日志中
SQL> insert into sunny values(4,'king');
1 row created.
SQL> commit;——————数据存于联机重做日志中
Commit complete.
SQL> alter system checkpoint;——————数据存于数据文件中
System altered.
4.先备份控制文件
SQL> alter database backup controlfile to trace as '/tmp/wilson.sql';
Database altered.
然后除了归档日志文件,把其它文件都删除了,关闭数据库,把备份的数据文件还原(没有控制文件和联机重做日志文件),
[root@oracle11g wilson]# cp /u01/ubackup/cold/*.dbf /u01/oradata/wilson/
5.修改备份的控制文件脚本
如果不用脚本创建,可以复制个二进制的控制文件,复制过去即可;
在脚本中有两组恢复方法:a.在联机重做日志正常的情况下,
b.在联机重做日志不正常的情况下,
a方法在用户管理的恢复(三)中使用了,请参照:Oracle—用户管理的完全恢复(三)
这里使用b方法,打开脚本修改一下,
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "WILSON" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/wilson/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/oradata/wilson/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/oradata/wilson/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/oradata/wilson/system01.dbf',
'/u01/oradata/wilson/sysaux01.dbf',
'/u01/oradata/wilson/undotbs01.dbf',
'/u01/oradata/wilson/users01.dbf',
'/u01/oradata/wilson/example01.dbf',
'/u01/oradata/wilson/app1_01.dbf',
'/u01/oradata/wilson/smallundo1.dbf'
CHARACTER SET AL32UTF8
;
注意上面语句之间能有空格行,
中间略..........
下面语句是脚本中的,也删除了,可以手工执行,
RECOVER DATABASE USING BACKUP CONTROLFILE
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'
SIZE 104857600 REUSE AUTOEXTEND OFF;
执行脚本,
SQL> @/tmp/wilson.sql
执行下面语句,因为联机重做日志丢失,所以恢复到某个日志切换序列号处,
SQL> recover database using backup controlfile until cancel;
提示,输入cancel
打开数据库,
SQL> alter database open resetlogs;
然后执行恢复临时表空间,
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'
SIZE 104857600 REUSE AUTOEXTEND OFF;
是脚本中的语句。
为什么删除脚本最后的四条语句? 因为没有了联机重做日志文件,所以脚本中RECOVER DATABASE USING BACKUP CONTROLFILE命令会出错,必须要使用until cancel进行人工干预。
6.查看表Dave.sunny
SQL> select * from sunny;
ID NAME
---------- ----------
3 memory
0 baby
1 Jasper
可以看到没有了记录(4,’king’),这是因为记录(3,’memory’)被存放到了归档日志文件中,而记录4没有,所以只能是不完全的恢复。
五.基于系统更改号的恢复
找到需要指定恢复的SCN号,然后使用命令recover database until change 号即可;
方法和上面说明的差不多。
六.RMAN的不完全恢复
它和用户管理的不完全恢复差不多,只是是使用RMAN来进行的,下面来举个例子来说明一下,
1.在Dave用户下,创建表和插入数据,
SQL> create table test (id int,name char(10));
Table created.
SQL> insert into test values(0,'heihei');
1 row created.
SQL> commit;
写到数据文件中
SQL> alter system checkpoint;
System altered.
2.RMAN连接上数据库,备份数据文件
RMAN> backup database format '/u01/backup/rman_hot_%U';
3.记录时间和删除表
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-09-06:00:53:43
SQL> drop table test;
Table dropped.
现在怎么恢复表? 在10g版本引用了闪回技术,可以使不完全恢复更方便。
4.在这里数据库进入mount状态,RMAN连接数据执行脚本
RMAN> run{
2> allocate channel c1 type disk;
3> allocate channel c2 type disk;
4> allocate channel c3 type disk;
5> set until time “2013-09-06:00:53:43';
6> restore database;
7> recover database;
8> alter database open resetlogs;}
即可。
RMAN的不完全恢复还可以指定日志文件的sequence号,命令如下,
Set until sequence 120 thread 1;
本文详细介绍了Oracle数据库的不完全恢复,包括时间恢复、取消恢复、基于SCN的恢复等,通过实例演示了恢复过程,如恢复到特定时间点、处理丢失的日志文件,并涉及RMAN的不完全恢复操作。
1322

被折叠的 条评论
为什么被折叠?



