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/dogConnected. ######创建一个临时表并插入一些数据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--------------------------------------------------test1test2test3SQL> conn / as sysdbaConnected.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down. ###手动删除数据文件SQL> host rm /u01/app/oracle/oradata/orcl/test.dbf;SQL> startupORACLE instance started.Total System Global Area 805875712 bytesFixed Size 2217672 bytesVariable Size 595593528 bytesDatabase Buffers 201326592 bytesRedo Buffers 6737920 bytesDatabase mounted.ORA-01157: cannot identify/lock data file 5 - see DBWR trace fileORA-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 2016Copyright (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:13RMAN> 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/dogConnected.SQL> select * from tmp1;COL--------------------------------------------------test1test2test3
演示二、控制文件丢失
在应用备份恢复时,必须知道目标数据库的DBID,有多种方式可查,比如我们创建自动备份时,如果没有更改其命名方式,文件名中会包含DBID;或者查看之前的rman 备份日志,其中登陆到rman 之后会显示出目标数据库的DBID
删除控制文件SQL> conn / as sysdbaConnected.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 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.已连接到目标数据库 (未启动) #####由于目标数据库控制文件丢失,在此处必须指定dbid#######RMAN> set dbid 1458478724正在执行命令: SET DBIDRMAN> 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 availableORA-27101: shared memory realm does not existLinux-x86_64 Error: 2: No such file or directory
报错了,需要启动到nomount
SQL> startup force nomount;ORACLE instance started.Total System Global Area 805875712 bytesFixed Size 2217672 bytesVariable Size 595593528 bytesDatabase Buffers 201326592 bytesRedo 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_1RMAN> 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:57RMAN> 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:55RMAN> sql 'alter database open resetlogs';sql 语句: alter database open resetlogs
总结:
SQL> startup force nomount;RMAN target/RMAN> setdbid xxxxxRMAN> 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';