背景:這里提到的常規恢復指的是數據庫有完備可用的RMAN物理備份。
實驗環境:RHEL6.4 + Oracle 11.2.0.4 單實例.
- 2.1 重做日志文件丟失或損壞
- 2.2 重做日志文件,數據文件丟失或損壞
- 2.3 控制文件丟失或損壞
- 2.4 控制文件,數據文件丟失或損壞
- 2.5 控制文件,重做日志文件,數據文件丟失或損壞
- 2.6 控制文件,重做日志文件丟失或損壞
- 2.7 控制文件,重做日志文件,參數文件丟失或損壞
- 2.8 控制文件,重做日志文件,參數文件,數據文件丟失或損壞
- 2.9 把數據庫恢復到某個SCN
- 2.10 把數據庫恢復到某個時間點
- 2.11 表空間基於時間點的恢復
二、常規恢復之不完全恢復:部分數據丟失
Oracle 數據庫常規恢復的幾個概念:常規恢復之完全恢復:不丟失數據。
比如數據文件丟失,臨時文件丟失,參數文件丟失。可以通過RMAN備份完全恢復數據庫。
示例:Oracle Recovery 01 - 常規恢復之完全恢復
常規恢復之不完全恢復:部分數據丟失。
一般是有控制文件或是在線重做日志文件丟失。通過RMAN備份恢復,resetlogs會導致丟失數據。
示例:Oracle Recovery 02 - 常規恢復之不完全恢復
注意事項:每次不完全恢復完成后,按照規范,數據庫應立即做一次全備,防止意外發生。
/bin/bash /usr2/backupsh/full_backup.rman
2.1 重做日志文件丟失或損壞
啟動數據庫報錯:
SQL> startup
ORACLE instance started.
Total System Global Area 1620115456 bytes
Fixed Size 2253704 bytes
Variable Size 939527288 bytes
Database Buffers 671088640 bytes
Redo Buffers 7245824 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u02/oracle/JINGYU/onlinelog/o1_mf_1_bwjsmn50_.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00312: online log 1 thread 1: '/u02/oracle/JINGYU/onlinelog/o1_mf_1_bwjsmn1l_.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
恢復方法:
SQL> shutdown immediate
SQL> startup mount
SQL> recover database until cancel;
SQL> alter database open resetlogs;
恢復完成后,數據庫做一次全備。
2.2 重做日志文件,數據文件丟失或損壞
### 啟動數據庫報錯: ###SQL> startup
ORACLE instance started.
Total System Global Area 1620115456 bytes
Fixed Size 2253704 bytes
Variable Size 939527288 bytes
Database Buffers 671088640 bytes
Redo Buffers 7245824 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/u02/oracle/JINGYU/datafile/o1_mf_system_bwjsmpcw_.dbf'
恢復方法:
RMAN> restore database;
SQL> recover database until cancel;
SQL> alter database open resetlogs;
# DRA建議:database point-in-time recovery
RMAN> restore database until scn 344834;
RMAN> recover database until scn 344834;
RMAN> alter database open resetlogs;
恢復完成后,數據庫做一次全備。
2.3 控制文件丟失或損壞
啟動數據庫報錯:
SQL> startup
ORACLE instance started.
Total System Global Area 1620115456 bytes
Fixed Size 2253704 bytes
Variable Size 939527288 bytes
Database Buffers 671088640 bytes
Redo Buffers 7245824 bytes
ORA-00205: error in identifying control file, check alert log for more info
恢復方法:
查看alert.log, 是否所有的控制文件都丟失了?
第一種情況:並非所有的控制文件都丟失
這種情況其實並不算是不完全恢復,因為並沒有丟失控制文件的信息。
可以直接從完好的控制文件拷貝到初始化參數文件中指定的控制文件的各個路徑。
第一種情況恢復方法:
cp xxx01.ctl xxx02.ctl
SQL> alter database mount;
SQL> alter database open;
第二種情況:所有的控制文件都丟失
那么就只能從RMAN備份中恢復控制文件。
第二種情況恢復方法:
RMAN> restore controlfile from '/u02/BACKUP/20150812/controlfilec-3589019315-20150812-07';
RMAN> alter database mount;
RMAN> recover database;
RMAN> alter database open resetlogs;
恢復完成后,數據庫做一次全備。
2.4 控制文件,數據文件丟失或損壞
啟動數據庫報錯:
SQL> startup
ORACLE instance started.
Total System Global Area 1620115456 bytes
Fixed Size 2253704 bytes
Variable Size 939527288 bytes
Database Buffers 671088640 bytes
Redo Buffers 7245824 bytes
ORA-00205: error in identifying control file, check alert log for more info
恢復方法:
RMAN> restore controlfile from '/u02/BACKUP/20150812/controlfilec-3589019315-20150812-07';
RMAN> alter database mount;
RMAN> restore database;
SQL> recover database using backup controlfile until cancel;
cancel
SQL> alter database open resetlogs;
恢復完成后,數據庫做一次全備。
2.5 控制文件,重做日志文件,數據文件丟失或損壞
參考`2.4 控制文件,數據文件丟失或損壞`。 恢復完成后,數據庫做一次全備。2.6 控制文件,重做日志文件丟失或損壞
參考`2.3 控制文件丟失或損壞`,如果是控制文件有其他備份,同時參考`2.1 重做日志文件丟失或損壞`。 恢復完成后,數據庫做一次全備。2.7 控制文件,重做日志文件,參數文件丟失或損壞
啟動數據庫報錯:
SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/db_1/dbs/initjingyu.ora'
恢復方法:
#恢復參數文件:
vi /u01/app/oracle/product/11.2.0/db_1/dbs/initjingyu.ora
SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initjingyu.ora'
RMAN> restore spfile from '/u02/BACKUP/20150813/controlfilec-3589191014-20150813-0b';
RMAN> shutdown immediate;
RMAN> startup nomount;
#恢復控制文件
RMAN> restore controlfile from '/u02/BACKUP/20150813/controlfilec-3589191014-20150813-0b';
RMAN> alter database mount;
#恢復數據庫
RMAN> restore database;
SQL> recover database using backup controlfile until cancel;
auto
SQL> recover database using backup controlfile until cancel;
cancel
SQL> alter database open resetlogs;
##DRA的建議(啟動到mount后,恢復到SCN 834531,測試也可行)
RMAN> restore database until scn 834531;
RMAN> recover database until scn 834531;
RMAN> alter database open resetlogs;
恢復完成后,數據庫做一次全備。
2.8 控制文件,重做日志文件,參數文件,數據文件丟失或損壞
參考`2.7 控制文件,重做日志文件,參數文件丟失或損壞`。恢復完成后,數據庫做一次全備。
2.9 把數據庫恢復到某個SCN
誤操作truncate了表:
SQL> create table t_scn as select * from user_objects;
Table created.
SQL> select count(1) from t_scn;
COUNT(1)
----------
4
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1025158
SQL> truncate table t_scn;
Table truncated.
SQL> select count(1) FROM T_SCN;
COUNT(1)
----------
0
注意:這里用到的select dbms_flashback.get_system_change_number from dual;,在現實情況這個scn或者下面的時間點都是需要通過Logmnr分析日志獲取的。
關於Logmnr的使用,后續會單獨整理一篇文章。
恢復方法:
run {
shutdown immediate;
startup mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
set until scn 1025158;
restore database;
recover database;
alter database open resetlogs;
}
驗證t_scn的表記錄已經恢復回來:
SQL> select count(1) from t_scn;
COUNT(1)
----------
4
恢復完成后,數據庫做一次全備。
2.10 把數據庫恢復到某個時間點
誤操作truncate了表:
SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2015-08-14 10:10:16
SQL> select count(1) from t_scn;
COUNT(1)
----------
4
SQL> truncate table t_scn;
Table truncated.
恢復方法:
run {
shutdown immediate;
startup mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
set until time '2015-08-14 10:10:16';
restore database;
recover database;
alter database open resetlogs;
}
恢復完成后,數據庫做一次全備。
2.11 表空間基於時間點的恢復(TSPITR)
參考:表空間基於時間點的恢復(TSPITR)
恢復完成后,數據庫做一次全備。
