RMAN的恢复篇

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;

启动 restore2016-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
完成 restore2016-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; 启动 restore2016-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'; 启动 restore2016-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 完成 restore2016-12-26 19:22:51
#######控制文件已恢复,将目标数据库置为加载状态 RMAN
> sql 'alter database mount'; sql 语句: alter database mount 释放的通道: ORA_DISK_1 RMAN> restore database; 启动 restore2016-12-26 19:24:12 启动 implicit crosscheck backup2016-12-26 19:24:12 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=129 设备类型=DISK 已交叉检验的 3 对象 完成 implicit crosscheck backup2016-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 完成 restore2016-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:ackupC-xxxxx';
RMAN> sql 'alter databasemount';
RMAN> restore database;
RMAN> recover database;
RMAN> sql 'alter database open resetlogs';
原文地址:https://www.cnblogs.com/zydev/p/6222451.html