当归档日志丢失,或者联机日志丢失了一部分,这个时候不能恢复到出错前的状态,只能恢复到出错前更早时间点状态,这叫不完全恢复。不完全恢复总的来说就是说在恢复中有到的东西有丢失,比如日志文件等。
不完全恢复应用场景:在做完全恢复的时候,因为归档文件的丢失这时候做的是不完全恢复,当数据文件丢失REDO文件也丢失这时候也是不完全恢复,控制文件丢失这有可能是完全恢复也有可能是不完全恢复。,当数据文件丢失恢复数据库到某一个时间点的时候数据库的结构与当前数据库结构不一样的时候也要做不完全恢复。在恢复之前和恢复之后都做一次备份很有必要在做不完全恢复前。
不完全恢复的种类:基于时间[这个可以指定恢复到某一个时间点],基于CANCEL【在恢复的过程中会应用归档日志,在APPLY归档日志的期间某一个时间点可以取消恢复】,
不完全恢复的时候打开数据库一定是ALTER DATABASE OPEN RESETLOG.这说明老的归档文件没用了,可以删了。
不完全恢复过程:先备份,RESTORE所有数据文件,把数据库MOUNT,恢复数据库到指定时间点RECOVER,以RESETLOG方式打开数据库,在做一次数据库的全备。
====================基于时间的不完全恢复=========================
会话1:查看测试表数据,关闭数据库
SQL> conn qq1/qq1
Connected.
SQL> select * from t;
ID NAME
---------- ----------
0 qq1
1 qq2
2 qq3
3 qq4
4 qq5
SQL>
SQL> conn /as sysdba
Connected.
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
会话2:冷备
root@oraclelinux dbtest]# cp * /backup/cold
[root@oraclelinux dbtest]# pwd
/u01/oradata/dbtest
[root@oraclelinux dbtest]# cd /backup/cold
[root@oraclelinux cold]# ll
[oracle@oraclelinux flash_recovery_area]$ cp -r DBTEST /backup/cold
会话1:打开数据库修改表记录
SQL> select * from t;
ID NAME
---------- ----------
0 qq1
1 qq2
2 qq3
3 qq4
4 qq5
SQL> insert into t values (5,'qq5');
1 row created.
SQL>commit;
Commit complete.
查看当前正在使用的联机重做日志组是那一组
SQL> conn /as sysdba
Connected.
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
4 INACTIVE
SQL>
查看当前数据库时间
SQL> select to_char(sysdate,'dd-mm-yyyy hh24:mi:ss') as currenttime from dual;
CURRENTTIME
-------------------
28-04-2012 15:51:46
SQL> 【这个时候表还在】
会话2:删除表
SQL> show user
USER is "QQ1"
SQL> drop table t;
Table dropped.
SQL>
会话1:强制关闭数据库
SQL> shutdown abort;
ORACLE instance shut down.
SQL>
会话2:RESTORE数据库
[oracle@oraclelinux dbtest]$ rm -f *.dbf
[oracle@oraclelinux dbtest]$ ll
total 278024
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control01.ctl
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control02.ctl
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control03.ctl
-rw-r--r-- 1 oracle oinstall 1228 Mar 22 21:09 ctl
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:55 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo03.log
-rw-r----- 1 oracle oinstall 52429312 Mar 23 14:50 redo04a.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo04.log
[oracle@oraclelinux dbtest]$ cp /backup/cold/*.dbf .
cp: cannot open `/backup/cold/example01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/paul01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/qq01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/qq02.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/sysaux01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/system01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/undotbs01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/users01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/wenchuan01.dbf' for reading: Permission denied
cp: cannot open `/backup/cold/wenchuan2.dbf' for reading: Permission denied
[oracle@oraclelinux dbtest]$ su - root
Password:
[root@oraclelinux ~]# cd /u01/oradata/dbtest
[root@oraclelinux dbtest]# ll
total 278024
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control01.ctl
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control02.ctl
-rw-r----- 1 oracle oinstall 7389184 Apr 28 15:55 control03.ctl
-rw-r--r-- 1 oracle oinstall 1228 Mar 22 21:09 ctl
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:55 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo03.log
-rw-r----- 1 oracle oinstall 52429312 Mar 23 14:50 redo04a.log
-rw-r----- 1 oracle oinstall 52429312 Apr 28 15:37 redo04.log
[root@oraclelinux dbtest]# cp /backup/cold/*.dbf .
[root@oraclelinux dbtest]#
把数据库MOUNT,现在控制文件是新的,数据文件是旧的
SQL> startup mount;
ORACLE instance started.
Total System Global Area 444596224 bytes
Fixed Size 1219904 bytes
Variable Size 130024128 bytes
Database Buffers 310378496 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL>
查看SCN号
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1731941
2 1731941
3 1731941
4 1731941
5 1731941
6 1731941
7 1731941
8 1731941
9 1731941
10 1731941
10 rows selected.
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
10 rows selected.【怎么是0呢?】
SQL>
恢复数据库
SQL> startup mount;
ORACLE instance started.
Total System Global Area 444596224 bytes
Fixed Size 1219904 bytes
Variable Size 130024128 bytes
Database Buffers 310378496 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> recover database until '2012-04-28:15:51:46';
ORA-00277: illegal option to the UNTIL recovery flag 2012-04-28:15:51:46
SQL> recover database until time '2012-04-28:15:51:46';
ORA-00283: recovery session canceled due to errors
ORA-38760: This database instance failed to turn on flashback database
SQL> alter database flashback off;
Database altered.
SQL> recover database until time '2012-04-28:15:51:46';
Media recovery complete.
SQL> alter database open resetlog;
alter database open resetlog
*
ERROR at line 1:
ORA-02288: invalid OPEN mode
SQL> alter database open resetlogs;
Database altered.
注意:所有文件应该让ORACLE用户有访问权限或者更大权限,控制文件在没权限的时候打不开,报错!