--====================
-- RMAN 还原与恢复
--====================
在Oracle中,三大文件即控制文件,数据文件,日志文件的丢失与破坏都将需要使用还原或恢复来使数据库正常化。而RMAN还原与恢复
是实现数据库完整性、可靠性必不可少的手段之一。还原简言之即是将所需的文件从备份中复制到原来文件所在的路径。还原通常可以包括
数据库、表空间、数据文件级别的还原。通常还原后的内容会滞后于最新的数据库SCN,因此将归档日志、联机重做日志文件中的内容更新到
还原的数据文件中,这个过程称之为恢复。
恢复的几种情形
1.在mount 或open 阶段完成的灾难恢复
非系统表空间,undo表空间,所有的数据文件
2.在nomount 阶段完成的灾难恢复
控制文件(controlfile)
3.在mount 阶段完成的灾难恢复
系统表空间,联机重做日志文件
有关恢复、介质恢复、一致性或非一致性恢复的详细概念请参考:Oracle 基于用户管理恢复的处理
一、RMAN在归档模式下的还原与恢复的简化例子
RMAN> connect target /
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
二、使用RMAN进行还原与恢复(非catalog方式)
1.数据文件丢失的恢复处理
--设定客户端环境变量并连接到数据库
C:>set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
C:>rman target sys/RedHat@dedicated nocatalog
--对数据库做全备
RMAN> backup as backupset
2> format '/u01/bk/rmbk/wb_%U'
3> tag=Whole_bak database;
RMAN> sql 'alter system archive log current';
--对数据库做级增量备份
RMAN> run{
2> allocate channel ch1 type disk;
3> backup incremental level 0 database
4> format '/u01/bk/rmbk/Inc_0_%U'
5> tag=Inc_0;
6> release channel ch1;}
--对表插入新记录并切换日志
SQL> select * from tb2;
ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry
SQL> insert into tb2 select 3,'Danny' from dual;
SQL> commit;
SQL> alter system checkpoint;
SQL> alter system switch logfile;
--对数据库做级增量备份
RMAN> run{
2> allocate channel ch1 type disk;
3> backup incremental level 1 database
4> format '/u01/bk/rmbk/Inc_1%U'
5> tag=Inc_1;
6> release channel ch1;}
SQL> shutdown immediate; --关闭数据库
SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf --删除所有的数据文件 */
SQL> startup mount
--使用RMAN连接到未mount状态的数据库
RMAN> connect target sys/redhat@dedicated
connected to target database: ORCL (DBID=1257415066, not open)
--执行数据库还原
--注意当存在完整备份也同时存在级增量备份时,Oracle会自动使用级增量备份来还原数据库
RMAN> restore database;
piece handle=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0 --下面可以看出还原的数据来自级增量备份
--执行数据库恢复
RMAN> recover database;
piece handle=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1
--打开数据库验证恢复
RMAN> alter database open;
SQL> select * from bk.tb2;
ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry
3 Danny
2.磁盘损坏导致数据文件无法恢复到原始位置或不想恢复到原始位置的处理
使用set newname 命令将数据文件还原到新路径
set newname for datafile 1 to '/system01.dbf'; --为恢复的数据文件指定新路径或重命名
使用switch命令将变更更新到控制文件
switch datafile n | all ; --等同于alter database rename file命令,该命令将恢复的数据文件重命名更新到控制文件
--下面的示例首先删除tbs01.dbf,接下来将其恢复到oradata目录中
SQL> ho rm $ORACLE_BASE/oradata/orcl/tbs01.dbf
SQL> startup mount force;
RMAN> connect target sys/redhat@dedicated
connected to target database: ORCL (DBID=1257415066, not open)
RMAN> run{
2> set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf';
3> restore database;
4> switch datafile all;
5> recover database;
6> alter database open;}
SQL> select file#,name,status from v$datafile where file#=6;
FILE# NAME STATUS
---------- -------------------------------------------------- -------
6 /u01/app/oracle/oradata/tbs01.dbf ONLINE
SQL> select count(1) from bk.tb2; --表tb2位于tbs01.dbf内
COUNT(1)
----------
3