目录
1. RMAN恢复的一般过程
1、restore 还原
2、recover
2. 恢复预览
restore ... preview
查看恢复需要哪些文件
restore tablespace users priview
恢复验证:
restore ... validate
restore tablespace users validate;
检查备份的可用性:
validate backupset 1;
validate backupset 98;
3. 恢复参数文件
恢复参数文件至少要启到NOMOUNT状态,丢了参数文件是无法启动到nomount
但RMAN提供了一个运行环境,即便丢了参数文件也可以启动到nomount,
启动到nomount 后就可以执行恢复了。
restore spfile to '/... ' from '/...';
RMAN> restore spfile
from '/u03/rman/ctlbak/c-1307704375-20120422-23';
或者
RMAN> restore spfile from autobackup;
如果控制文件自动备份不在闪回中可以
RMAN> run {
2> set controlfile autobackup format for device type disk
to '/u03/rman/ctlbak/%F';
3> restore spfile from autobackup;
4> }
RMAN> shutdown immediate;
RMAN> startup
4. 恢复控制文件
恢复必须在NOMOUNT状态下进行
1)在nomount还原控制文件
restore controlfiel to ... from ...
RMAN> set dbid=1307704375
RMAN> set controlfile autobackup format for device type disk
to '/u03/rman/ctlbak/%F';
RMAN> restore controlfile from autobackup;
也可将以上三条简化为一条:
RMAN> restore controlfile
from '/u03/rman/ctlbak/c-1307704375-20120422-23';
2)启动到mount进行数据库恢复
SQL> alter database mount
RMAN> recover database;
3) 以resetlogs open
RMAN> sql 'alter database open resetlogs';
5. 恢复数据文件
1、数据文件离线(offline)
2、还原数据文件
3、应用日志恢复
4、数据文件上线(online)
例:
SQL> host rm /u02/users02.dbf
SQL> host rm /u01/app/oracle/oradata/orcl/users01.dbf
SQL> select * from scott.emp;
select * from scott.emp
*
ERROR at line 1:
ORA-00376: file 7 cannot be read at this time
ORA-01110: data file 7: '/u02/users02.dbf'
恢复:
SQL> alter database datafile '/u02/users02.dbf' offline;
RMAN> restore datafile 7;
RMAN> recover datafile 7;
RMAN> sql 'alter database datafile 7 online';
RMAN> sql 'alter database datafile 4 offline';
RMAN> restore datafile 4;
RMAN> recover datafile 4;
RMAN> sql 'alter database datafile 4 online';
如果还不行的话,将其所在的表空间online
SQL> alter tablespace users online;
例2:磁盘损坏,原有路径无法访问情况的恢复
如上 /u02 由于磁盘故障,数据完全丢失,且无法访问
由于默认从备份中还原时,是还原到原来的位置,要还原到其他位置时
还原前要设置新的路径
set newname for datafile 7 to '/....'
应用日志进行恢复时,也要告诉oracle,数据文件已经发生变化了,不
在原有位置了
switch datafile 7
RMAN> run {
2> set newname for datafile 7 to '/u03/users02.dbf';
3> restore datafile 7;
4> switch datafile 7;
5> recover datafile 7;
6> }
6. 表空间的恢复
如果数据文件丢失太多的话,可以不一个文件一个文件的恢复,可以整个
表空间来恢复,恢复一个表空间就是恢复这个表空间的所有数据文件。
其大致过程
1、表空间离线
2、还原表空间
3、恢复表空间
4、表空间在线
SQL> host rm /u01/app/oracle/oradata/orcl/users01.dbf
SQL> host rm /u03/users02.dbf
恢复:
SQL> alter tablespace users offline;
alter tablespace users offline
*
ERROR at line 1:
ORA-01116: error in opening database file 7
ORA-01110: data file 7: '/u03/users02.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
SQL> alter tablespace users offline immediate;
RMAN> restore tablespace users;
RMAN> recover tablespace users;
RMAN> sql 'alter tablespace users online';
7. 系统表空间损坏恢复
系统表空间、UNDO表空间损坏的恢复不能在OPEN状态进行
必须要停机,在 mount 状态下进行
SQL> host rm /u01/app/oracle/oradata/orcl/system01.dbf
SQL> shutdown abort
SQL> startup mount;
RMAN> restore tablespace system;
RMAN> recover tablespace system;
其实也可以 restroe database;
recover database;
RMAN> alter database open;
8. 所有数据文件丢了(包括system.dbf)
必须在mount状态下进行
SQL> shutdown abort
SQL> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
9. 未备份的数据文件恢复
1、数据文件离线
2、restore (RMAN只要日志没空,数据文件没备份,能根据日志信息创建)
3、recover
4、数据文件上线
SQL> create tablespace tt datafile '/u02/tt01.dbf' size 50m;
SQL> create table tt01 tablespace tt
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> create table tt02 tablespace tt
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> create table tt03 tablespace tt
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> host rm /u02/tt01.dbf
SQL> alter database datafile 8 offline;
RMAN> restore datafile 8;
RMAN> recover datafile 8;
RMAN> sql 'alter database datafile 8 online';
10. 所有参数文件、控制文件、数据文件全丢了的恢复
1、恢复参数文件
RMAN> startup nomount
RMAN> restore spfile from
'/u03/rman/ctlbak/c-1307704375-20120505-09';
RMAN> shutdown immediate;
RMAN> startup nomount
2、恢复控制文件
RMAN> restore controlfile from
'/u03/rman/ctlbak/c-1307704375-20120505-09';
3、恢复数据文件
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
11. UNDO坏了
mount 下恢复
12. RMAN的不完全恢复
12.1 不完全恢复的类型
基于时间点不的完全恢复
set until time="to_date('2012-05-05 11:50:02',
'yyyy-mm-dd hh24:mi:ss')"
基于SCN号:
set until scn ...
基于日志序列号的不完全恢复:
set until sequenct ... (恢复到这个序列号之前,不包括这个序列号)
12.2 RMAN不完全恢复的一般流程
1、启动到mount状态下
2、设置一种恢复类型进行恢复
run {
set until time=.... 或者
set until scn ... 或者
set until sequence ...
restore ...
recover ...
alter database open resetlogs;
}
例:
SQL> set time on
13:49:36 SQL> drop user scott cascade;
13:49:48 SQL> select * from scott.emp;
select * from scott.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
MAN> run {
2> set until time="to_date('2012-05-05 13:49:33',
'yyyy-mm-dd hh24:mi:ss')";
3> restore database;
4> recover database;
5> }
SQL> alter database open resetlogs;
例:恢复误删除的表空间
SQL> create table t1 tablespace test
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> create table t2 tablespace test
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> create table t3 tablespace test
as select * from scott.dept;
SQL> alter system switch logfile;
SQL> create table t4 tablespace test
as select * from scott.dept;
SQL> alter system switch logfile;
14:11:48 SQL> drop tablespace test including contents and datafiles;
RMAN> run {
2> set until time="to_date('2012-05-05 14:11:45',
'yyyy-mm-dd hh24:mi:ss')";
3> restore database;
4> recover database;
5> }
这样直接恢复是有问题的
主要原因是,不能拿当前的控制文件来恢复误删除的表空间
要拿 drop tablespace 之前的控制文件来恢复
那就说先要恢复drop tablespace 之前的控制文件
再恢复表空间
RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> restore controlfile from
'/u03/rman/ctlbak/c-1307704375-20120505-0b';
RMAN> alter database mount;
RMAN> run {
2> set until time="to_date('2012-05-05 14:11:45',
'yyyy-mm-dd hh24:mi:ss')";
3> restore database;
4> recover database;
5> }
RMAN> alter database open resetlogs;
13. 将数据库恢复到另一个机器
大致过程:
1、在源库作数据库的完整备份
2、在目标机器上创建数据库的运行环境(如安装oracle软件,设置一
些参数,创建运行目录)
3、恢复数据库到目标机器,并以resetlogs打开
例:将183数据库备份到28机器上恢复
183机器上的操作:
RMAN> backup as backupset database format
'/u03/rman/%d_%T_%s_%p';
SQL> create table test3 as select * from scott.dept;
SQL> alter system switch logfile;
RMAN> backup as backupset archivelog all format
'/u03/rman/archlog_%d_%I_%T';
28机器上的操作:
1)创建数据库运行的目录
su - oracle
[oracle@t28 oracle]$ cd $ORACLE_BASE
[oracle@t28 oracle]$ mkdir admin
[oracle@t28 oracle]$ mkdir oradata
[oracle@t28 oracle]$ cd admin
[oracle@t28 admin]$ mkdir orcl
[oracle@t28 admin]$ cd orcl
[oracle@t28 orcl]$ mkdir adump bdump cdump dpdump pfile udump
[oracle@t28 oracle]$ cd $ORACLE_BASE
[oracle@t28 oracle]$ mkdir oradata/orcl
[oracle@t28 oracle]$ exit
[root@t28 ~]# mkdir /u02
[root@t28 ~]# mkdir /u02/arch_log
[root@t28 ~]# mkdir /u03
[root@t28 ~]# mkdir /u03/rman/
[root@t28 ~]# mkdir /u03/rman/ctlbak
[root@t28 ~]# chown oracle:oinstall /u03 -R
[root@t28 ~]# chown oracle:oinstall /u02 -R
[root@t28 ~]# su - oracle
2)复制ORACLE参数文件,密码文件和数据库及日志的备份
[oracle@t28 dbs]$ scp 10.1.0.183:/u01/app/oracle/
product/10.2/db_1/dbs/spfileorcl.ora ./
[oracle@t28 dbs]$ scp 10.1.0.183:/u01/app/oracle/
product/10.2/db_1/dbs/orapworcl ./
[oracle@t28 dbs]$ scp -r 10.1.0.183:/u03/rman/* /u03/rman/
3)进行恢复
SQL> startup nomount
[oracle@t28 ~]$ uniread rman target sys/oracle
RMAN> restore controlfile from '/u03/rman/ctlbak
/c-1307704375-20120505-0e';
RMAN> run {
2> set until sequence 5; #这个序号因机器而异
3> restore database;
4> recover database;
5> }
也可以通过RMAN的 duplicate 来实现
具体过程:目标机器创建相关目录,设置环境,源机器备份,两边设置
网络服务名,rman 登录时同时登录到两个库
rman target sys/oracle@tar auxiliary sys/oracle@aux
RMAN> run
{
duplicate target database to orcl2;
--把目标库复制到aux 同时库名为orcl2
}
恢复目录:
恢复目录不是一个什么磁盘目录,它也是一个数据库,不过这个数据库
不存业务数据,它存放的是其它数据库的备份信息,通常用在多数据库
的情况下,数据库比较少的情况下很少用恢复目录。
数据库的备份信息可以保存在控制文件中也可以保存恢复目录中
没有恢复目录就保存在控制文件,有的话,就保存两份:本机控制文件
一份,恢复目录一份。但控制文件保存的时间比较短(取决于参数:
control_file_record_keep_time,默认7天),但恢复目录就可以突
破这些限制:
恢复目录创建
本例中:t183为target数据库,t28为catalog数据库
1、准备一个恢复目录的数据库,并配好监听。
2、执行rman 操作的机器上配置到目录标数据库和恢复目录数据的tnsnames.ora
3、恢复目录的数据库上创建与恢复目录相关的表空间、用户、并给用户授权
SQL> create tablespace rcat_tbs datafile
'/u02/rcat_tab01.dbf' size 200m;
SQL> create user rcat_owner identified by oracle
default tablespace rcat_tbs;
SQL> grant connect,resource to rcat_owner;
SQL> grant recovery_catalog_owner to rcat_owner;
4、登录到catalog 数据库,创建恢复目录
[oracle@t183 ~]$ rman catalog rcat_owner/oracle@t28
RMAN> create catalog tablespace rcat_tbs;
5、把目标数据库target注册到恢复目录数据库中
rman target sys/oracle catalog rcat_owner/oracle@t28
RMAN> register database;
之后备份话要同时连到两个数据库,备份信息也就同时写到两个数据库
了(目标库的控制文件和恢复目录数据库)
有时可能忘了连恢复目录,事先进行两个库之间的数据库同步
rman target sys/oracle catalog rcat_owner/oracle@t28
RMAN> resync catalog;