Oracle 數據庫的恢復實際上包含了兩個概念:數據庫修復(RESTORE)與數據庫恢復(RECOVER):
數據庫修復:是指利用備份的數據庫文件來替換已經損壞的數據庫文件或者將其恢復到一個新的位置。RMAN 在進行修復操作時,會利用恢復目錄(沒有建立恢復目錄的話就使用目標數據庫的控制文件)來獲取備份信息,並從中選擇最合適的備份進行修復操作。選擇備份時有兩個原則(1、選擇距離恢復目錄時刻最近;2、優先選擇鏡像復制,其次才是備份集)
數據庫恢復:是指利用重做日志或增量備份來重建丟失的數據。
一、對數據庫進行完全介質恢復
1、啟動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT;
2、執行恢復操作
RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACETEMP;
注意:DELETE ARCHIVELOGS 和SKIP TABLESPACE 兩個參數是可選擇的,作用如下:
DELETEARCHIVELOGS:表示RMAN將在完成恢復過程后自動刪除那些在恢復過程中修復的歸檔日志文件。
SKIPTABLESPACE:跳過指定表空間,比如臨時表,當然臨時表空間即使你不跳過它也不會恢復的。
3、打開數據庫
RMAN> ALTER DATABASE OPEN;
如果你的數據庫並非處於歸檔模式,那么必須使用ALTER DATABASEOPEN RESETLOGS 來打開數據庫,因為RMAN 會認為在非歸檔模式下是一個不一致的備份,執行resetlogs 之后,oracle 將會把scn 重新置為0。
二、恢復表空間
1、啟動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUPMOUNT;
2、進行恢復操作,在恢復之前,如果需要被恢復的表空間未處於脫機狀態,需要通過alter tablespace ...Offline 語句將其置為脫機:
RMAN> SQL 'ALTER TABLESPACEjweb OFFLINE IMMEDIATE'; RMAN> RESTORE TABLESPACEjweb; RMAN> RECOVER TABLESPACEjweb; RMAN> SQL 'ALTER TABLESPACEjweb ONLINE';
3、打開數據庫
RMAN> ALTER DATABASE OPEN;
三、恢復數據文件
1、啟動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUPMOUNT;
2、進行恢復操作,在恢復之前,如果需要被恢復的表空間未處於脫機狀態,需要通過alter tablespace ...Offline 語句將其置為脫機,操作數據文件時可以直接指定數據文件,也可以以數據文件序號代替:
RMAN>SQL 'ALTER DATABASE DATAFILE 10 OFFLINE; RMAN> RESTORE DATAFILE 10; RMAN> RECOVER DATAFILE 10; RMAN>SQL ' ALTER DATABASE DATAFILE 10 ONLINE;
3、打開數據庫
RMAN> ALTER DATABASE OPEN;
演示:
演示一、數據文件丟失
SQL> conn dog/dog Connected.
######創建一個臨時表並插入一些數據 SQL> create table tmp1(col varchar(50)); Table created. SQL> insert into tmp1 values('test1'); 1 row created. SQL> insert into tmp1 values('test2'); 1 row created. SQL> insert into tmp1 values('test3'); 1 row created. SQL> commit; Commit complete. SQL> select * from tmp1; COL -------------------------------------------------- test1 test2 test3 SQL> conn / as sysdba Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down.
###手動刪除數據文件 SQL> host rm /u01/app/oracle/oradata/orcl/test.dbf; SQL> startup ORACLE instance started. Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 595593528 bytes Database Buffers 201326592 bytes Redo Buffers 6737920 bytes Database mounted. ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/test.dbf' SQL> select instance_name,status from v$instance; INSTANCE_NAME STATUS ---------------- ------------ orcl MOUNTED
使用RMAN進行恢復
[oracle@oracle ~]$ rman target/ 恢復管理器: Release 11.2.0.1.0 - Production on 星期一 12月 26 18:54:46 2016 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 已連接到目標數據庫: ORCL (DBID=1458478724, 未打開) RMAN> restore datafile 5; 啟動 restore 於 2016-12-26 18:54:53 使用目標數據庫控制文件替代恢復目錄 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=129 設備類型=DISK 通道 ORA_DISK_1: 正在開始還原數據文件備份集 通道 ORA_DISK_1: 正在指定從備份集還原的數據文件 通道 ORA_DISK_1: 將數據文件 00005 還原到 /u01/app/oracle/oradata/orcl/test.dbf 通道 ORA_DISK_1: 正在讀取備份片段 /backup/0nro5ada_1_1 通道 ORA_DISK_1: 段句柄 = /backup/0nro5ada_1_1 標記 = TAG20161223T011314 通道 ORA_DISK_1: 已還原備份片段 1 通道 ORA_DISK_1: 還原完成, 用時: 00:00:15 完成 restore 於 2016-12-26 18:55:13 RMAN> recover datafile 5; 啟動 recover 於 2016-12-26 18:55:36 使用通道 ORA_DISK_1 正在開始介質的恢復 線程 1 序列 9 的歸檔日志已作為文件 /u01/ARCHLOG/1_9_931133551.dbf 存在於磁盤上 線程 1 序列 10 的歸檔日志已作為文件 /u01/ARCHLOG/1_10_931133551.dbf 存在於磁盤上 線程 1 序列 11 的歸檔日志已作為文件 /u01/ARCHLOG/1_11_931133551.dbf 存在於磁盤上 線程 1 序列 12 的歸檔日志已作為文件 /u01/ARCHLOG/1_12_931133551.dbf 存在於磁盤上 線程 1 序列 13 的歸檔日志已作為文件 /u01/ARCHLOG/1_13_931133551.dbf 存在於磁盤上 線程 1 序列 14 的歸檔日志已作為文件 /u01/ARCHLOG/1_14_931133551.dbf 存在於磁盤上 線程 1 序列 15 的歸檔日志已作為文件 /u01/ARCHLOG/1_15_931133551.dbf 存在於磁盤上 通道 ORA_DISK_1: 正在開始將歸檔日志還原到默認目標 通道 ORA_DISK_1: 正在還原歸檔日志 歸檔日志線程=1 序列=8 通道 ORA_DISK_1: 正在讀取備份片段 /backup/0oro5afm_1_1 通道 ORA_DISK_1: 段句柄 = /backup/0oro5afm_1_1 標記 = TAG20161223T011430 通道 ORA_DISK_1: 已還原備份片段 1 通道 ORA_DISK_1: 還原完成, 用時: 00:00:02 歸檔日志文件名=/u03/ARCHLOG/1_8_931133551.dbf 線程=1 序列=8 歸檔日志文件名=/u01/ARCHLOG/1_9_931133551.dbf 線程=1 序列=9 歸檔日志文件名=/u01/ARCHLOG/1_10_931133551.dbf 線程=1 序列=10 歸檔日志文件名=/u01/ARCHLOG/1_11_931133551.dbf 線程=1 序列=11 歸檔日志文件名=/u01/ARCHLOG/1_12_931133551.dbf 線程=1 序列=12 歸檔日志文件名=/u01/ARCHLOG/1_13_931133551.dbf 線程=1 序列=13 介質恢復完成, 用時: 00:00:45 完成 recover 於 2016-12-26 18:56:29
驗證數據是否得到恢復
SQL> alter database open; Database altered. SQL> conn dog/dog Connected. SQL> select * from tmp1; COL -------------------------------------------------- test1 test2 test3
演示二、控制文件丟失
在應用備份恢復時,必須知道目標數據庫的DBID,有多種方式可查,比如我們創建自動備份時,如果沒有更改其命名方式,文件名中會包含DBID;或者查看之前的rman 備份日志,其中登陸到rman 之后會顯示出目標數據庫的DBID
刪除控制文件
SQL> conn / as sysdba Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> host rm /u01/app/oracle/oradata/orcl/*.ctl;
使用RMAN進行恢復
[oracle@oracle ~]$ rman target/ 恢復管理器: Release 11.2.0.1.0 - Production on 星期一 12月 26 19:10:54 2016 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 已連接到目標數據庫 (未啟動)
#####由於目標數據庫控制文件丟失,在此處必須指定dbid####### RMAN> set dbid 1458478724 正在執行命令: SET DBID RMAN> restore controlfile from autobackup; 啟動 restore 於 2016-12-26 19:13:09 使用目標數據庫控制文件替代恢復目錄 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 12/26/2016 19:13:09 上) 失敗 RMAN-12010: 自動通道分配初始化失敗 RMAN-06403: 無法獲得完全授權的會話 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux-x86_64 Error: 2: No such file or directory
報錯了,需要啟動到nomount
SQL> startup force nomount; ORACLE instance started. Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 595593528 bytes Database Buffers 201326592 bytes Redo Buffers 6737920 bytes
再次進入RMAN進行恢復
###從備份中恢復控制文件文件########如果打開了自動備份,通過可以通過 restore controlfile from autobackup
RMAN> restore controlfile from '/backup/c-1458478724-20161223-00'; 啟動 restore 於 2016-12-26 19:22:33 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=129 設備類型=DISK 通道 ORA_DISK_1: 正在還原控制文件 通道 ORA_DISK_1: 還原完成, 用時: 00:00:16 輸出文件名=/u01/app/oracle/oradata/orcl/control01.ctl 輸出文件名=/u01/app/oracle/flash_recovery_area/control02.ctl 完成 restore 於 2016-12-26 19:22:51
#######控制文件已恢復,將目標數據庫置為加載狀態 RMAN> sql 'alter database mount'; sql 語句: alter database mount 釋放的通道: ORA_DISK_1 RMAN> restore database; 啟動 restore 於 2016-12-26 19:24:12 啟動 implicit crosscheck backup 於 2016-12-26 19:24:12 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=129 設備類型=DISK 已交叉檢驗的 3 對象 完成 implicit crosscheck backup 於 2016-12-26 19:24:16 啟動 implicit crosscheck copy 於 2016-12-26 19:24:16 使用通道 ORA_DISK_1 完成 implicit crosscheck copy 於 2016-12-26 19:24:17 搜索恢復區中的所有文件 正在編制文件目錄... 沒有為文件編制目錄 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在開始還原數據文件備份集 通道 ORA_DISK_1: 正在指定從備份集還原的數據文件 通道 ORA_DISK_1: 將數據文件 00001 還原到 /u01/app/oracle/oradata/orcl/system01.dbf 通道 ORA_DISK_1: 將數據文件 00002 還原到 /u01/app/oracle/oradata/orcl/sysaux01.dbf 通道 ORA_DISK_1: 將數據文件 00003 還原到 /u01/app/oracle/oradata/orcl/undotbs01.dbf 通道 ORA_DISK_1: 將數據文件 00004 還原到 /u01/app/oracle/oradata/orcl/users01.dbf 通道 ORA_DISK_1: 將數據文件 00005 還原到 /u01/app/oracle/oradata/orcl/test.dbf 通道 ORA_DISK_1: 將數據文件 00006 還原到 /u01/app/oracle/oradata/orcl/bk02.dbf 通道 ORA_DISK_1: 正在讀取備份片段 /backup/0nro5ada_1_1 通道 ORA_DISK_1: 段句柄 = /backup/0nro5ada_1_1 標記 = TAG20161223T011314 通道 ORA_DISK_1: 已還原備份片段 1 通道 ORA_DISK_1: 還原完成, 用時: 00:02:38 完成 restore 於 2016-12-26 19:26:57 RMAN> recover database; 啟動 recover 於 2016-12-26 19:27:49 使用通道 ORA_DISK_1 正在開始介質的恢復 線程 1 序列 14 的歸檔日志已作為文件 /u01/app/oracle/oradata/orcl/redo02.log 存在於磁盤上 線程 1 序列 15 的歸檔日志已作為文件 /u01/app/oracle/oradata/orcl/redo03.log 存在於磁盤上 線程 1 序列 16 的歸檔日志已作為文件 /u01/app/oracle/oradata/orcl/redo01.log 存在於磁盤上 通道 ORA_DISK_1: 正在開始將歸檔日志還原到默認目標 通道 ORA_DISK_1: 正在還原歸檔日志 歸檔日志線程=1 序列=8 通道 ORA_DISK_1: 正在讀取備份片段 /backup/0oro5afm_1_1 通道 ORA_DISK_1: 段句柄 = /backup/0oro5afm_1_1 標記 = TAG20161223T011430 通道 ORA_DISK_1: 已還原備份片段 1 通道 ORA_DISK_1: 還原完成, 用時: 00:00:01 歸檔日志文件名=/u03/ARCHLOG/1_8_931133551.dbf 線程=1 序列=8 歸檔日志文件名=/u01/ARCHLOG/1_9_931133551.dbf 線程=1 序列=9 歸檔日志文件名=/u01/ARCHLOG/1_10_931133551.dbf 線程=1 序列=10 歸檔日志文件名=/u01/ARCHLOG/1_11_931133551.dbf 線程=1 序列=11 歸檔日志文件名=/u01/ARCHLOG/1_12_931133551.dbf 線程=1 序列=12 歸檔日志文件名=/u01/ARCHLOG/1_13_931133551.dbf 線程=1 序列=13 歸檔日志文件名=/u01/app/oracle/oradata/orcl/redo02.log 線程=1 序列=14 歸檔日志文件名=/u01/app/oracle/oradata/orcl/redo03.log 線程=1 序列=15 歸檔日志文件名=/u01/app/oracle/oradata/orcl/redo01.log 線程=1 序列=16 介質恢復完成, 用時: 00:01:01 完成 recover 於 2016-12-26 19:28:55 RMAN> sql 'alter database open resetlogs'; sql 語句: alter database open resetlogs
總結:
SQL> startup force nomount; RMAN target/ RMAN> setdbid xxxxx RMAN> restore controlfile from autobackup; 或者: RMAN> restore controlfile from 'd:\backup\C-xxxxx'; RMAN> sql 'alter databasemount'; RMAN> restore database; RMAN> recover database; RMAN> sql 'alter database open resetlogs';