不完全恢復分為用戶不完全恢復和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;