您的位置:首页 > 其它

RMAN 还原与恢复1(RMAN Complete Recovery)

2013-02-22 17:25 375 查看
  在Oracle中,三大文件即控制文件,数据文件,日志文件的丢失与破坏都将需要使用还原或恢复来使数据库正常化。而RMAN还原与恢复是实现数据库完整性、可靠性必不可少的手段之一。还原简言之即是将所需的文件从备份中复制到原来文件所在的路径。还原通常可以包括数据库、表空间、数据文件级别的还原。通常还原后的内容会滞后于最新的数据库SCN,因此将归档日志、联机重做日志文件中的内容更新到还原的数据文件中,这个过程称之为恢复。

恢复的几种情形

1.在mount 或open 阶段完成的灾难恢复:非系统表空间,undo表空间,所有的数据文件。

2.在nomount 阶段完成的灾难恢复:控制文件(controlfile)。

3.在mount 阶段完成的灾难恢复:系统表空间,联机重做日志文件。

一、RMAN在归档模式下的还原与恢复的简化例子

RMAN> connect target / nocatalog

RMAN> startup mount;

RMAN> restore database;

RMAN> recover database;

RMAN> alter database open;


二、使用RMAN进行还原与恢复(非catalog方式)

1.数据文件丢失的恢复处理nocatalog(数据库mount状态)

--对数据库做全备

RMAN> backup as compressed backupset
2> format '/tmp/backup/whole_%U'
3> tag =Whole_bak database;
RMAN> sql 'alter system archive log current';
sql statement: alter system archive log current
RMAN>


--对数据库做0级增量备份

RMAN> run {
2> allocate channel ch1 type disk;
3> backup incremental level 0 database
4> format '/tmp/backup/Inc_0_%U'
5> tag=Inc_0;
6> release channel ch1;
7> }


--对表插入新记录并切换日志

SQL> select * from t order by 1;

ID NAME
---------- ----------------
0 oracle
1 oracle
2 oracle
3 oracle
4 oracle
5 oracle
6 oracle

7 rows selected.

SQL> insert into t select 7,'myrman' from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> alter system checkpoint;

SQL> alter system switch logfile;


--对数据库做1级增量备份

RMAN> run{
2> allocate channel ch1 type disk;
3> backup incremental level 1 database
4> format '/tmp/backup/Inc_1_%U'
5> tag=Inc_1;
6> release channel ch1;
7> }


SQL> shutdown immediate;   --关闭数据库

SQL> ho rm $ORACLE_BASE/oradata/sunbak/*.dbf  --删除所有的数据文件 */

SQL> startup mount


--使用RMAN连接到mount状态的数据库

-bash-3.00$ rman target / nocatalog

Recovery Manager: Release 10.2.0.2.0 - Production on Sat Jan 26 13:24:57 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

connected to target database: SUN (DBID=1913551800, not open)
using target database control file instead of recovery catalog

RMAN>


--执行数据库还原

--注意当存在完整备份也同时存在级增量备份时,Oracle会自动使用级增量备份来还原数据库
RMAN> restore database;

--下面可以看出还原的数据来自级增量备份
channel ORA_DISK_1: reading from backup piece /tmp/backup/Inc_0_1fo0cqbb_1_1
channel ORA_DISK_1: restored backup piece 1
piece handle=/tmp/backup/Inc_0_1fo0cqbb_1_1 tag=INC_0

--执行数据库恢复
RMAN> recover database;

channel ORA_DISK_1: reading from backup piece /tmp/backup/Inc_1_1ho0crhi_1_1
channel ORA_DISK_1: restored backup piece 1
piece handle=/tmp/backup/Inc_1_1ho0crhi_1_1 tag=INC_1

--打开数据库验证恢复
RMAN> alter database open;

SQL> select * from t order by 1;

ID NAME
---------- ----------------
0 oracle
1 oracle
2 oracle
3 oracle
4 oracle
5 oracle
6 oracle
7 myrman

8 rows selected.

SQL>


2.磁盘损坏导致数据文件无法恢复到原始位置或不想恢复到原始位置的处理(数据库mount状态)

  使用set newname 命令将数据文件还原到新路径:set newname for datafile 1 to '<newdir>/system01.dbf'; --为恢复的数据文件指定新路径或重命名

  使用switch命令将变更更新到控制文件:switch datafile n | all ; --等同于alter database rename file命令,该命令将恢复的数据文件重命名更新到控制文件

--下面的示例首先删除sun01_1.dbf,接下来将其恢复到oradata目录中

--关闭数据库
SQL> shutdown immediate
SQL> quit

--删除文件
-bash-3.00$ rm -f /u01/oradata/sunbak/sun01_1.dbf

--启到mount状态
SQL> startup mount
ORACLE instance started.
SQL>

--查看删除文件
SQL>  select file#,name,status from v$datafile;

FILE# NAME                                STATUS
---------- ----------------------------------- -------
1 /u01/oradata/sunbak/system01.dbf    SYSTEM
2 /u01/oradata/sunbak/undotbs01.dbf   ONLINE
3 /u01/oradata/sunbak/sysaux01.dbf    ONLINE
4 /u01/oradata/sunbak/users01.dbf     ONLINE
5 /u01/oradata/sunbak/example01.dbf   ONLINE
6 /u01/oradata/sunbak/sun01_1.dbf     ONLINE
7 /u01/oradata/sunbak/sun02_1.dbf     ONLINE
8 /u01/oradata/sunbak/sun03_1.dbf     ONLINE

8 rows selected.

SQL>

--连接rman
bash-3.00$ rman target / nocatalog
connected to target database: SUN (DBID=1913551800, not open)
using target database control file instead of recovery catalog
RMAN>

--恢复
RMAN> run{
2> set newname for datafile 6 to '/u01/oradata/sunbak/sun01.dbf';
3> restore database;
4> switch datafile all;
5> recover database;
6> alter database open;
7> }
--验证结果
SQL> conn user1/user1
Connected.
SQL> select * from t order by 1;

ID NAME
---------- ----------------
0 oracle
1 oracle
2 oracle
3 oracle
4 oracle
5 oracle
6 oracle
7 myrman

8 rows selected.

SQL>


3.恢复表空间(数据库open状态)

--删除表空间内的数据文件,删除后在针对位于该表空间的表进行插入记录以及实施检查点进程

--插入测试数据
SQL> insert into user1.t select 8,'inspur' from dual;
SQL> commit;
SQL> alter system checkpoint;

System altered.

SQL>

--强制检查点后,告警日志出现错误提示,视图v$recover_file给出了故障数据文件
[oracle@oradb ~]$ tail -f alert_sun.log
Errors in file /u01/admin/sun/bdump/sun_ckpt_4554.trc:
ORA-01171: datafile 6 going offline due to error advancing checkpoint
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/oradata/sunbak/sun01.dbf'
ORA-27041: unable to open file
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3

SQL> select * from v$recover_file;

FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
6 OFFLINE OFFLINE FILE NOT FOUND              0

SQL>  select name,status from v$datafile where file#=6;

NAME                                STATUS
----------------------------------- -------
/u01/oradata/sunbak/sun01.dbf       RECOVER

SQL>

--使用RMAN命令恢复数据文件,此时数据库处于OPEN状态,因此首先需要将表空间脱机,恢复完成之后再将其联机
RMAN> run {
2> sql 'alter tablespace sun01 offline immediate';
3> set newname for datafile 6 to '/u01/oradata/sunbak/sun01_1.dbf';
4> restore tablespace sun01;
5> switch datafile all;
6> recover tablespace sun01;
7> sql 'alter tablespace sun01 online';
8> }

--检查状态
SQL> select name,status from v$datafile where file#=6;

NAME                                STATUS
----------------------------------- -------
/u01/oradata/sunbak/sun01_1.dbf     ONLINE

SQL>

SQL> select * from user1.t order by 1;

ID NAME
---------- -----------------------------------
0 oracle
1 oracle
2 oracle
3 oracle
4 oracle
5 oracle
6 oracle
7 myrman
8 inspur

9 rows selected.

SQL>


--也可以使用下面的命令完成同样的功能
--注意如果表空间内有多个数据文件,而仅有单个数据文件损坏则采用下面的方式处理更为妥当

RMAN> run {
2> sql 'alter database datafile 6 offline immediate';
3> set newname for datafile 6 to '/u01/oradata/sunbak/sun01_1.dbf';
4> restore datafile 6;
5> switch datafile all;
6> recover tdatafile 6;
7> sql 'alter databaes datafile 6 online';
8> }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: