RMAN 不完全恢复

不完全恢复:

1).lost all(丢失所有文件,记得记录好:DBID=1341461043)

  1. rman>backup database;  
  2. sql>insert into …  
  3. sql> alter system switch logfile;  
  4. rm all file(spfile,controlfile,redo log file,data file)  
  5. shutdown abort  
  6. rman>start nomount;  
  7.      set dbid=    ;  
  8.      restore spfile from autobackup;  
  9.      shutdown abort;  
  10.      startup nomount;  
  11.      restore controlfile from autobackup;  
  12.      alter database mount;  
  13.      restore database;  
  14.      recover database;  
  15.      alter database open resetlogs;  

2).基于时间点的不完全恢复:

  1.   rman target /  
  2.   rman>backup database;(backup database plus archivelog  delete all input;  # 备份数据库包括归档日志,并删除已经备份的归档日志)  
  3.   
  4.   sys>alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;  # 修改系统时间格式  
  5.   sys>select sysdate from dual;  
  6.   sys>drop user hr cascade;  
  7.   
  8.  rman:  
  9.      SYS>shutdown immediate;  
  10.      SYS>startup mount;  
  11.      RMAN> run{  
  12.             set until time “to_date(‘xxxxxx’,’yyyy-mm-dd hh24:mi:ss’)”;  
  13.             restore database;  
  14.             recover database;  
  15.            alter database open resetlogs;  
  16.            }  
  17.      or  
  18.      RMAN>run{  
  19.           shutdown immediate;  
  20.           startup mount;  
  21.           sql ‘alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;  
  22.           set until time ‘xxxxxxxx’;  
  23.           restore database;  
  24.           recover database;  
  25.           alter database open resetlogs;  
  26.       }     
  27.   
  28. select recid,sequence#,resetlogs_change#,resetlogs_time from v$log_history;  

3).基于SCN号的不完全恢复(scn-incomplete)

  1. $rman target /  
  2.      rman>backup database;(backup database plus archivelog  delete all input)  
  3.   
  4.    sys:  
  5.      SYS>select current_scn from v$database;  
  6.      SYS>drop table scott.emp purge;  
  7.   
  8.    rman:  
  9.    RMAN>startup force mount;  
  10.    RMAN>run{  
  11.            set until scn=xxxxxx;  
  12.            restore database;  
  13.            recover database;  
  14.            }  
  15.   alter database open resetlogs;  

4).基于sequence的不完全恢复(sequence-incomplete)

  1. sys>select name,SEQUENCE#,STATUS,DELETED,APPLIED,ARCHIVED from v$archived_log;  
  2.      sys>select * from v$log;  
  3.   
  4.      rman>backup database  
  5.      sys>alter system switch logfile;  
  6.      $rm *.dbf, rm a archivelog  
  7.   
  8.      rman>startup mount   
  9.      rman>run(  
  10.           set until sequence xx thread 1;  
  11.           restore database;  
  12.           recover database;  
  13.           }  
  14.      alter database open resetlogs;  

5).丢失所有控制文件的情况:
a).从备份中恢复控制文件

  1. RMAN>backup database;  
  2. $>rm *.ctl  
  3. RMAN> restore controlfile from ‘file_name’;  
  4. SYS> shutdown abort  
  5. SYS> startup mount;  
  6. ***********************************************************  
  7. SYS> select FILE#,CHECKPOINT_CHANGE# from v$datafile;  
  8.      select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;  # 查询相应信息  
  9. ***********************************************************  
  10. RMAN>restore database;  
  11. SYS> recover database using backup controlfile until cancel;(filename)  
  12. SYS> alter database open resetlogs;  

b).重建控制文件:

  1. sys>alter database backup controlfile to trace;  
  2. $>vi trace file  
  3. sys>startup nomount;  
  4. sys>@trace_file;  

6)丢失当前重做日志文件、一个数据文件(lost current redo log file a data file)

  1. rman>backup database;  
  2. sys>select * from v$log;  
  3. $rm current redo log file  
  4. sys>shutdown abort  
  5. sys>startup  
  6. sys>alter database clear unarchived logfile group 3;  
  7. rman>restore database;  
  8. sys>recover database until cancel;  
  9. sys>alter database open resetlogs  

7)丢失重做日志文件,无备份(lost redo log file (without backup))

  1. sys>recover database until cancel;  
  2.        auto  
  3. sys>alter database open resetlogs;  
  4.   
  5. _allow_resetlogs_corruption=true   # 在参数文件,添加这一行  
  6. _corrupted_rollback_segments=true  
  7. _offline_rollback_segments=true  
  8. select KSPPINM from x$ksppi  

RMAN 备份和恢复

在归档模式下:

1.rman登陆,备份全库

     $rman target /
     RMAN>backup database;             # DBID=1180863394,数据库唯一标识号

1).丢失所有数据文件下的恢复:

       $rm *.dbf         # 模拟丢失所有数据文件
       RMAN>shutdown abort
       $rman target /
       RMAN>startup mount;         # 在RMAN下,启动数据库到mount状态
       RMAN>restore database;      # 还原数据库[RMAN自动根据备份还原数据库]
       RMAN>recover database;      # 恢复数据库[应用归档日志的过程]
       RMAN>alter database open;

2).在数据库关闭的情况下,丢失一个数据文件:

       $rman target /
       RMAN>backup as backupset database;    # 备份数据库,以备份集的方式
       $rm user01.dbf                # 模拟一个数据文件丢失
       $rman target /
       RMAN>shutdown abort
       RMAN>startup mount;           # 登陆RMAN,数据库启动到mount状态
       RMAN>restore datafile xx;     # 还原数据文件[xx 代表数据文件的编号]
       RMAN>recover datafile xx;     # 恢复数据文件
       RMAN>alter database open;

3).在数据库open的情况下,丢失一个数据文件:

       RMAN>sql 'alter tablespace ts_name offline immediate';   # 让丢失的那个数据文件脱机
       RMAN>restore tablespace ts_name;         # 还原数据文件
       RMAN>recover tablespace ts_name;         # 恢复数据文件
       RMAN>sql 'alter tablespace ts_name online';   # 使数据文件联机

4).系统表空间数据文件丢失:

        $rm system file
        shutdown abort            # 模拟系统表空间数据文件丢失
        RMAN>startup mount        # 启动到mount状态
        RMAN>restore datafile 1;  # 还原数据文件
        RMAN>recover datafile 1;  # 恢复数据文件
        RMAN>alter database open;

5).丢失UNDO表空间数据文件:

        rm undo file
        shutdown abort;        # 模拟undo数据文件丢失
        rman tartget /
        RMAN>startup mount;    # 登陆RMAN,启动到mount状态
        RMAN>report schema;    # 显示所有数据文件对象
        RMAN>restore datafile x;  # 还原指定数据文件[这里特指UNDO]
        RMAN>recover datafile x;  # 恢复指定数据文件
        RMAN>alter database open;

6).数据文件丢失,还原数据文件到一个新的位置:

       alter tablespace users offline immediate;
       or alter database datafile x offline;          # 使用上面两种方法,使数据文件脱机
       RMAN> run{
             set newname for datafile '/u01/app/oracle/oradata/orcl/DATA_TS01.DBF'
             to '/u02/app/oracle/oradata/orcl/DATA_TS01.DBF';    # 将旧文件制定到新的地点
             restore datafile 6;   # 还原数据文件
             switch datafile 6;    # 数据文件切换[此步很重要,移动要做]
             recover datafile 6;   # 恢复数据文件
             }                         
       RMAN>sql 'alter tablespace users online';  # 联机

7).恢复数据库到一台新的主机[可以算是迁移数据库]

前期准备:
A.记录源数据库的DBID[这里很重要,必须记录]
B.复制源数据库参数文件到新的主机相应的目录[…./dbs/….]
C.确认源数据库有备份,包括控制文件[建议,开启自动备份 CONFIGURE CONTROLFILE AUTOBACKUP on],方便新的主机访问

还原数据库到新的主机:[在新主机上操作]

(1).$ setenv ORACLE_SID orcl # 设置实例[原数据库的实例名]

(2).$ rman TARGET / # 登陆RMAN

(3).RMAN> SET DBID 1090770270; # DBID设置为源数据库的DBID,可以在源数据库上,通过V$DATABASE视图查询

(4).RMAN> STARTUP NOMOUNT; # 启动数据库到nomount状态 [这里会报下面的错]

startup failed: ORA-01078: failure in processing system parameters

(5).还原参数文件

      RMAN>RUN
          {
           RESTORE SPFILE FROM AUTOBACKUP;    # 还原参数文件,关闭数据库
           SHUTDOWN ABORT;
          }

(6).修改参数文件,相应文件的位置[这里建议新机器的路径和目前机器的路径一致]

(7).RMAN> STARTUP NOMOUNT ; # 用新的参数文件启动到nomount状态

(8).还原控制文件

      RUN
       {
         RESTORE CONTROLFILE FROM AUTOBACKUP;
         ALTER DATABASE MOUNT;
       }

(9).还原数据文件和日志文件

            RUN
               {  # 重命名相关数据文件,日志文件
                SET NEWNAME FOR DATAFILE 1 TO '?/oradata/test/system01.dbf';
                SET NEWNAME FOR DATAFILE 2 TO '?/oradata/test/undotbs01.dbf';
                SET NEWNAME FOR DATAFILE 3 TO '?/oradata/test/sysaux.dbf';
                SET NEWNAME FOR DATAFILE 4 TO '?/oradata/test/users01.dbf';
                SET NEWNAME FOR DATAFILE 5 TO '?/oradata/test/example01.dbf';
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo01.log''
                  TO ''?/oradata/test/redo01.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo02.log''
                 TO ''?/oradata/test/redo02.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo03.log''
                TO ''?/oradata/test/redo03.log'' ";
                RESTORE DATABASE;
                SWITCH DATAFILE ALL;    # 数据文件切换[重要]
                RECOVER DATABASE;
               }

(10).以RESETLOGS方式打开数据库:

RMAN> ALTER DATABASE OPEN RESETLOGS;

2.备份相关视图
v$backup_files
v$backup_datafile
v$backup_set
v$backup_piece
v$backup_redolog
v$backup_spfile
v$backup_device
v$rman_configuration
v$copy_corruption