首先,將數據庫設置爲歸檔
歸檔模式下,可以用冷備,也可以用熱備,冷備方法同非歸檔模式(過程略)。
歸檔模式下的熱備:
1) 查看有沒有其他用戶在熱備
SQL> select * from v$backup;
2) 將數據庫或表空間設置爲備份狀態
SQL> alter database begin backup;
--將整個數據庫設置爲備份狀態
SQL> alter tablespace users begin backup;
--將一個表空間設置爲備份狀態
3) 在操作系統下拷貝文件
操作系統下拷文件,必須在已設置爲備份狀態時才行,如果不設置爲備份狀態
隨意拷,那這個拷貝是無效的,沒辦法恢復
4) 結束數據庫或表空間的備份狀態
SQL> alter database end backup;
SQL> alter tablespace users end backup;
例:
hot_get_file.sql
set heading off;
set feedback off;
set pagesize 0;
set trimspool on;
spool /share/ocp/backup_script/hot_backup_command.sql;
select 'alter database begin backup;' from dual
union all
select 'host cp '||name||' /u03/backup/' from v$datafile
union all
select 'host cp '||name||' /u03/backup/' from v$controlfile
union all
select 'host cp $ORACLE_HOME/dbs/spfile${ORACLE_SID}.ora /u03/backup/' from dual
union all
select 'host cp $ORACLE_HOME/dbs/orapw${ORACLE_SID} /u03/backup/' from dual
union all
select 'alter database end backup;' from dual;
spool off;
SQL> @/share/ocp/backup_script/hot_get_file.sql
自動熱備的實現
參見非歸檔模式下的自動備份
SCN
SCN 是數據庫中一個非常重要的數據結構,可認爲是oracle的內部時鐘,是一個只會增長
不少減少的一個數值,這個數值可以用來表示各種操作的時間點。 與備份恢複相關的重要SCN
號有:
1)數據文件頭的系統檢查的SCN號
v$datafile_header.CHECKPOINT_CHANGE#
2)控制文件中數據文件的系統檢查點SCN號
v$datafile.CHECKPOINT_CHANGE#
如果 v$datafile_header 和 v$datafile 記錄的數據文件
SCN號不一致,就要進行介質恢復
3)數據文件的終止SCN號
v$datafile.LAST_CHANGE# 上次停庫時的SCN,只要是運行,該值就爲空
這個SCN號主要是判斷啓動時,是否要進行實例恢復
歸檔模式下的完全恢復(控制文件完好的情況下)
歸檔模式下完全恢復的一般流程:
1) 如果能夠offline就offline,如果不能offline就必須啓動到mount狀態。
2) 還原數據文件
把備份數據文件,拷貝過去
cp ...
3) 應用日誌前滾
recover datafile ......
recover tablespace ......
recover database
4) online或alter database open
1、恢復數據文件
SQL> create table t1 as select * from scott.emp;
SQL> create table t2 as select * from scott.emp;
SQL> create table t3 as select * from scott.emp;
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
--------------- ------------------------------
DEPT T2
EMP T2
BONUS T2
SALGRADE T2
T1 T2
T2 T2
T3 T2
SQL> select TABLESPACE_NAME,FILE_NAME from dba_data_files
order by tablespace_name;
TABLESPACE_NAME FILE_NAME
------------------------------ ---------------------
T1 /u02/t101.dbf
T2 /u02/t201.dbf
SQL> shutdown immediate;
SQL> host rm /u02/t201.dbf
SQL> startup
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: '/u02/t201.dbf'
可看到數據庫已無法啓動了,因爲剛纔刪除了數據文件 t201.dbf
這時,不要急於馬上恢復t201.dbf,先把數據庫啓啓來,讓其他的有服務不要停止了
SQL> alter database datafile 7 offline;
SQL> alter database open;
SQL> host cp /u03/backup/t201.dbf /u02/ --把備份文件拷過來
SQL> recover datafile 7;
ORA-00279: change 834606 generated at 06/17/2012 09:47:06 needed for thread 1
ORA-00289: suggestion : /u02/arch_log/1_25_783790158.dbf
ORA-00280: change 834606 for thread 1 is in sequence #25
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto --輸入auto 讓他自己找歸檔日誌
SQL> alter database datafile 7 online;
2、磁盤壞了,數據文件丟了,而且磁盤目錄無法訪問,必須恢復到其他位置
SQL> shutdown immediate;
SQL> host rm /u02/t201.dbf
SQL> startup
SQL> alter database datafile '/u02/t201.dbf' offline;
SQL> alter database open;
SQL> host cp /u03/backup/t201.dbf /u03/
SQL> alter database rename file '/u02/t201.dbf' to '/u03/t201.dbf';
SQL> recover datafile '/u03/t201.dbf';
SQL> alter database datafile '/u03/t201.dbf' online;
3、數據文件無備份的恢復
無備份份的數據文件恢復前提:從創建開始的日誌文件一直要在
SQL> create tablespace test datafile '/u02/test01.dbf' size 50m;
SQL> alter system switch logfile;
SQL> create table test1 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table test2 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table test3 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table test4 tablespace test as select * from emp;
SQL> host rm /u02/test01.dbf
SQL> shutdown abort
SQL> startup
SQL> alter database datafile '/u02/test01.dbf' offline;
SQL> alter database open;
SQL> alter database create datafile '/u02/test01.dbf';
4、恢復表空間
SQL> create table a1 tablespace t1 as select * from scott.emp;
SQL> alter system switch logfile;
SQL> create table a2 tablespace t1 as select * from scott.emp;
SQL> alter system switch logfile;
SQL> create table a3 tablespace t1 as select * from scott.emp;
SQL> alter system switch logfile;
SQL> host rm /u02/t101.dbf
SQL> startup
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u02/t101.dbf'
SQL> alter database datafile '/u02/t101.dbf' offline;
--在這裏,由於是在啓動階段報錯的,停在mount狀態,所以不能把tablespace
offline,只能一個文件一個文件的 offline,如果表空間有多個文件,要
把所有的數據文件offline
--如果是在打開狀態,可以 alter tablespace t1 offline;
SQL> alter database open;
SQL> host cp /u03/backup/t101.dbf /u02/
SQL> recover tablespace t1;
SQL> alter tablespace t1 online;
5、全庫恢復
啓動到mount 把所有的數據文件還原,之後 SQL> recover database
控制文件的恢復
實驗前先備份控制文件
SQL> alter database backup controlfile to '/home/oracle/ctl.bak';
SQL> alter database backup controlfile to trace as '/home/oracle/ctl.sql';
進行一系統操作
SQL> select name from v$controlfile;
破壞,並以abort 方式關閉
SQL> host rm /u01/app/oracle/oradata/orcl/control01.ctl
SQL> host rm /u02/control02.ctl
SQL> host rm /u03/control03.ctl
SQL> shutdown abort
有控制文件備份時的恢復
SQL> startup
這時由於控制文件的丟失無法啓動
SQL> shutdown immediate;
恢復過程:
1) 拷備份的控制文件
SQL> host cp /u03/backup/control01.ctl /u01/app/oracle/oradata/orcl/
SQL> host cp /u03/backup/control02.ctl /u02/
SQL> host cp /u03/backup/control03.ctl /u03/
2) SQL> startup
由於控制文件是老的,所以要前滾控制文件,讓數據文件、控制文件一致
SQL> recover database using backup controlfile;
auto -- 讓自己去找歸檔
完了以後,提示有個歸檔找不到,查一下確實也沒有這個歸檔,
這樣極有可能是這個日誌還沒歸檔,這時用聯機日誌去前滾,再次運行
SQL> recover database using backup controlfile;
/u01/app/oracle/oradata/orcl/redo01.log --一個一個去試聯機日誌了
SQL> recover database using backup controlfile;
/u01/app/oracle/oradata/orcl/redo02.log --一個一個去試聯機日誌了
提示恢復完成後,要以resetlogs 的方式打開數據庫,
而打開後,最好把數據庫備份一下
SQL> alter database open resetlogs
無備份的恢復:
根據自身數據庫的情況,用腳本來創建控制文件(這種創建一定不要丟了一些數據文件、日誌文件)
SQL> host rm /u01/app/oracle/oradata/orcl/control01.ctl
SQL> host rm /u02/control02.ctl
SQL> host rm /u03/control03.ctl
SQL> shutdown abort;
SQL> startup nomount
寫個創建控制文件的腳本
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M,
GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M,
GROUP 4 '/u01/app/oracle/oradata/orcl/redo04.log' SIZE 50M,
GROUP 5 '/u01/app/oracle/oradata/orcl/redo05.log' SIZE 50M
DATAFILE
'/u01/app/oracle/oradata/orcl/system01.dbf',
'/u01/app/oracle/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/oradata/orcl/users01.dbf',
'/u02/example01.dbf',
'/u02/t101.dbf',
'/u03/t201.dbf',
'/u02/users02.dbf',
'/u02/bgts101.dbf',
'/u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf',
'/u02/undo201.dbf',
'/u02/perfstat01.dbf'
CHARACTER SET WE8ISO8859P1
;
再運行這個腳本
SQL> @/home/oracle/create_controlfile.sql
運行該腳本後,數據庫自動MOUNT了
SQL> recover database;
SQL> alter database open;
不完全恢復:
不完全恢復的基本流程:
1) 關閉數據庫,對現場作個冷備
2) 從備份中拷貝所有的數據文件
3) 數據庫啓動到mount 執行一種方式的不完全恢復
不完全恢復的方式有:
基本時間的不完全恢復
recover database until time 'yyyy-mm-dd hh24:mi:ss';
如
recover database until time '2012-06-17 14:23:55';
基於SCN號的不完全恢復
SQL> recover database until change ...
RMAN> recover database until scn ...
基於撤消的不完全恢復(常用於日誌丟失):
SQL> recover database until cancel;
RMAN> recover database until sequence;
4) 以resetlogs 的方式打開數據庫
5) 恢復後對數據庫做個備份
例:誤刪除一個用戶的恢復(基於時間點的恢復,不涉及控制文件的變化)
SQL> set time on
14:36:32 SQL> drop user scott cascade;
14:37:06 SQL> shutdown abort;
1) 還原所有的數據文件
host cp /u03/backup/system01.dbf /u01/app/oracle/oradata/orcl/system01.dbf
host cp /u03/backup/undotbs01.dbf /u01/app/oracle/oradata/orcl/undotbs01.dbf
host cp /u03/backup/sysaux01.dbf /u01/app/oracle/oradata/orcl/sysaux01.dbf
host cp /u03/backup/users01.dbf /u01/app/oracle/oradata/orcl/users01.dbf
host cp /u03/backup/example01.dbf /u02/example01.dbf
host cp /u03/backup/t101.dbf /u02/t101.dbf
host cp /u03/backup/t201.dbf /u03/t201.dbf
host cp /u03/backup/users02.dbf /u02/users02.dbf
host cp /u03/backup/bgts101.dbf /u02/bgts101.dbf
host cp /u03/backup/o1_mf_xx_7x5h9kv4_.dbf /u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf
host cp /u03/backup/undo201.dbf /u02/undo201.dbf
host cp /u03/backup/perfstat01.dbf /u02/perfstat01.dbf
host cp /u03/backup/test01.dbf /u02/test01.dbf
2)
SQL> startup mount
3)
SQL> recover database until time '2012-06-17 14:36:29';
SQL> alter database open resetlogs;
誤刪除表空間的恢復(涉及到控制文件的變化)
SQL> create table t1 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table t2 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table t3 tablespace test as select * from emp;
SQL> alter system switch logfile;
SQL> create table t4 tablespace test as select * from emp;
15:44:43 SQL> drop tablespace test including contents and datafiles;
在這裏由於表空間是正常刪除的,所以控制文件中已經沒有test表空間的信息了
這時,不能拿這個控制文件來恢復test表空間,而要用以前備份的控制文件,
且這個文件有test表空間信息
1) 還原控制文件和所有數據文件
host cp /u03/backup/control01.ctl /u01/app/oracle/oradata/orcl/control01.ctl
host cp /u03/backup/control02.ctl /u02/control02.ctl
host cp /u03/backup/control03.ctl /u03/control03.ctl
host cp /u03/backup/system01.dbf /u01/app/oracle/oradata/orcl/system01.dbf
host cp /u03/backup/undotbs01.dbf /u01/app/oracle/oradata/orcl/undotbs01.dbf
host cp /u03/backup/sysaux01.dbf /u01/app/oracle/oradata/orcl/sysaux01.dbf
host cp /u03/backup/users01.dbf /u01/app/oracle/oradata/orcl/users01.dbf
host cp /u03/backup/example01.dbf /u02/example01.dbf
host cp /u03/backup/t101.dbf /u02/t101.dbf
host cp /u03/backup/t201.dbf /u03/t201.dbf
host cp /u03/backup/users02.dbf /u02/users02.dbf
host cp /u03/backup/bgts101.dbf /u02/bgts101.dbf
host cp /u03/backup/o1_mf_xx_7x5h9kv4_.dbf /u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf
host cp /u03/backup/undo201.dbf /u02/undo201.dbf
host cp /u03/backup/perfstat01.dbf /u02/perfstat01.dbf
host cp /u03/backup/test01.dbf /u02/test01.dbf
2) SQL> startup mount
3)
SQL> recover database until time '2012-06-17 15:44:40';
SQL> alter database open resetlogs;
聯機日誌丟失的處理
1、非活動組的丟失、損壞
可以直接刪除掉
也可以
SQL> alter database clear logfile group 4;
2、活動組和當前組的處理
如果及時發現了,趕緊輸入
SQL> alter system checkpoint;
然後切日誌
SQL> alter system switch logfile;
之後
SQL> alter database clear unarchived logfile group 4;
修復完後要及時對數據庫備份,否則以後恢復時,剛纔第4組日誌沒歸檔,會導致恢復失敗
如果沒有時發現,停庫重啓後,發現的
那最好進行不完全恢復
如果沒有備份,不能進行不完全恢復,用隱含參數強制打開數據庫,把數據導出去,
再重新建庫,把數據導進來。
隱含參數:
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;