控制文件的备份与恢复


        控制文件的备份与恢复
       
        实例启动时进程既要读取控制文件又要写控制文件,所以该阶段只要有一个控制文件损坏实例就无法到MOUNT状态。
        即 该阶段 控制文件缺一不可。有损坏时只能启动到 NOMOUNT状态。
       
 备份
       
        控制文件的备份有: 在线控制文件镜像备份、手动备份、自动备份
        在线镜像备份是指 除了第一个被使用的控制文件(初始化参数 control_files指向的第一个)外,其他的控制文件即为镜像备份。
        自动备份:
        显示自动备份:该类型的备份默认情况下是关闭的。在RMAN中 用 configure autobackup 命令 的属性设置为 ON 即可打开这以后
                                    oracle就会在 RMAN执行任何备份操作导致控制文件内RMAN资料库被更新之后,自动做备份。还有在数据块物理
                                    结构发生变化之后 也会自动备份。物理结构发生变化导致自动备份 ORACLE 交给了 MMON后台进程延时处理完成,
                                    而MMON后台进程又交给其管理的奴隶进程(M000)完成备份操作。要修改延时的时间间隔(单位 秒),请修改
                                    隐含参数 "_controlfile_autobackup_delay" 。由物理结构发生变化而引发的自动备份 只能使用DISK类型的默认通道。
                                    也会自动备份 控制文件。
                                    --查看自动备份的状态
                                   RMAN> SHOW CONTROLFILE AUTOBACKUP;
                                   ---启用自动备份
                                   RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
                                   ---关闭自动备份
                                   RMAN>CONFIGURE CONTROLFILE AUTOBACKUP OFF;
                                  
        隐式自动备份:当自动备份 关闭的情况下,使用RMAN 命令备份 关键数据文件时,控制文件会被自动备份。同样 执行
                                 backup  database  和 backup tablespace system 时控制文件也必然被自动备份。但是ORACLE不认为这是自动备份,
                                 因为这种的备份集没有在快速恢复区的 autobackup 目录下,而是在backupset目录,备份片名由 “o1_mf_ncsnf_”
                                 开头,将来恢复时,此类备份的步骤和自动备份的步骤是有别的。即 采用手动备份恢复而非自动备份恢复。
                                
        手动备份分为:备份集、镜像复制备份、重建脚本
                                备份集合镜像复制备份默认路径是 快速恢复区,如果没有启用快速恢复区则路径是 $oracle_home/dbs
                                重建脚本则写入常规的追踪文件路径中。
                       
          备份集备份:
            RMAN> BACKUP AS BACKUPSET CURRENT CONTROLFILE;
         镜像复制备份:
            RMAN 和 SQL/PLUS 都可以完成对控制文件的镜像复制备份。
            RMAN>backup as copy current controlfile format ='path';
            SQL>alter database backup controlfile to 'path';
          重建脚本:
              SQL/PLUS 同样可以产生一种 脚本文件,其中包含能够重新创建控制文件的命令。
              SQL>ALTER DATABASE BACKUP CONTROLFILE TO TRACE;----将控制文件备份为文本文件
              SQL>ALTER DATABASE BACKUP CONTROLFILE TO 'PATH';---将控制文件备份为二进制文件
              ---默认追踪文件的位置
              SELECT VALUE FROM v$diag_info where name ='Default Trace File';
              --或 通过查看初始化参数USER_DUMP_DEST  来确定追踪文件路径
              SQL>SHOW PARAMETER USER_DUMP_DEST
             
              重建脚本中包含 两条 CREATE CONTROLFILE 的命令 ,分别 是 不重设日志(noresetlogs)、重设日志(resetlogs)。
             
    按时间跨度分类备份:在线镜像备份、结构备份、历史备份
            在线镜像备份:也称为在线副本,或当前备份。也就是control_files初始化参数所指向的除了损坏的控制文件以外的其他
                                        健康的控制文件。它们理解当前库的物理结构,知道最新的检查点、最新的在线日志序列号、最新的SCN
                                        数据库SCN、控制文件序列号、控制文件SCN、各个数据文件头部检查点信息及归档日志。
                                       
             结构备份:该备份中数据库的物理结构信息(数据文件及在线重做日志)和当前控制文件一致,但是最新的检查点、最新
                                的重做日志序列号、SCN、数据库SCN、控制文件序列号、控制文件SCN、各个数据文件头部检查点集及归档日志
                                信息比当前控制文件中的陈旧。简言之:如果产生自动备份或手动备份后,数据库的结构没有发生任何变化,那么
                                它们便是结构备份。
                               
             历史备份:该备份中的数据库的结构物理信息和当前控制文件中的不一致。简言之:如果产生自动备份或手动备份之后,
                                数据库的物理结构发生变化,那么它们就是历史备份。
                               
  
 恢复
       
            控制文件的恢复是需要重做日志帮助的。恢复包括:先从备份还原,然后用重做日志恢复。
            恢复是在 NOMOUNT 状态进行的。
            大多情况下,恢复控制文件先考虑 在线镜像备份,其次是结构备份,最后考虑历史备份。
            除了镜像备份之外,其他备份恢复控制文件的顺序为:
            1、从备份中还原控制文件
            2、用重做日志介质恢复数据库(也称为:应用日志 (apply log))
            3、以重设日志的方式打开数据库。
           
            在线镜像备份恢复:
                1、执行 startup nomount 将实例带到 NOMOUNT 状态
                2、查看警告日志和追踪日志观察损坏的具体情况
                3、用操作系统命令使用健康的在线镜像备份替换已损坏的活丢失的控制文件
                4、执行 alter  database  mount 将实例带到 mount 状态
                5、执行 alter database open 打开数据库,恢复完成。
               
               
           自动备份恢复:
                1、执行 startup  nomount 将实例 带到 nomount  状态
                2、运行 restore controlfile from autobackup 命令还原控制文件
                3、执行 mount  database  命令将实例带到 mount 状态
                4、执行 recover database 命令恢复数据库
                5、执行 alter database open resetlogs 命令打开数据库,恢复完成
               
             延伸:recover database 的过程是这样的:自动在快速恢复区内探索尚不清楚的备份和归档日志、自动找到最当前的
                    在线日志(即 实例关闭时LGWR正在写的那个在线日志,它是恢复过程终点的标志)、判断控制文件是否需要
                    恢复、读取日志信息以恢复数据文件和控制文件的部分信息。有时甚至自动利用通道从归档日志的备份中将归
                    档日志自动还原,以便为恢复操作所用。
                   
              recover database  命令在 RMAN 和 sql/plus 中的是由区别的:
              1、SQL>RECOVER DATABASE ---用来对所有的数据文件进行恢复,并且只能使用保存在文件系统上的归档日志和在线日志,
                                                       ---并且前提是控制文件,不可以是还原或重建得到的。
             2、 SQL>recover database using backup controlfile ---用来对所有数据文件和控制文件进行恢复,并且只能使用保存在文件系统
                                                                                    --上的归档日志和在线日志
             3、 RMAN>recover database;---对所有数据文件和控制文件进行恢复,并且可以使用增量备份、备份中的和文件系统中的归档
                                                    --日志,以及文件系统上的在线日志
                                                   
              后两种可以自动修复以下3种情况:
                            1、备份控制文件中没有某个数据文件和表空间信息,但是实际存在的情况。
                            2、备份控制文件中没有某个在线日志组的信息,但是实际上存在的情况。
                            3、备份控制文件中具有某个在线日志组的信息,但是实际上是不存在的。
           
          
           使用带 RESETLOGS 命令打开数据库,是因为 recover 命令只能修复控制文件中数据库物理结构信息,而不能修改控制文件
            中的当前重做日志的序列号等信息,recover 执行完后,控制文件中的当前在线日志序列号还是陈旧的,oralce采用重设
            日志功能,日志序列号将从1重新开始。该处的 resetlogs 仅仅是为了照顾还原的控制文件,这里的resetlogs 和不完全恢复
            中的 resetlogs 不同。
           
       手动备份恢复:
            1、启动实例到 NOMOUNT 状态
            2、探索备份集的位置
            3、执行 restore controlfile from 'path' 命令还原控制文件(如果采用了恢复编录 from子句可以丢弃)
            4、执行 mount database 将实例带入 mount 状态
            5、执行 recover database  命令恢复数据库
            6、执行 alter  database open resetlogs 命令打开数据库,恢复完成
           
           
      历史备份恢复:
            1、如果备份控制文件中具有某个数据库文件或表空间信息,但是实际上不存在。则:
            SQL> recover database using backup controlfile  或 recover database skip tablespace  才能修复。
            2、备份控制文件中没有某个在线日志组的的信息,但实际上是存在的。则:
            SQL>recover database using backup controlfile 命令,并手动指定重做日志的路径后才能完成恢复。
           
            自动修复不一致的情况:
            1、备份控制文件中没有某个数据文件和表空间信息,但是实际存在的情况。
                控制文件自动备份功能关闭,在备份控制文件之后,创建了一个 a 表空间,备份控制文件中无此表空间,
                这样物理结构与当前不一致,备份就成为了 历史备份。还原过程为:
                RMAN>
                startup nomount;
                restore controlfile from 'path';---即历史备份路径
                mount database;
               SQL> select name from v$datafile;---查看新表空间中的数据文件是否存在(非必要过程)
                recover database;
                alter database open resetlogs;
               
           
            手动修复不一致的情况:
                控制文件自动备份关闭,备份了控制文件后,删除了一个 a 表空间,则在备份控制文件中,该表空间和数据文件
                 是存在的。这时控制文件损坏,还原过程:
                 RMAN>
                    startup nomount;
                    restore controlfile from 'path';
                    mount database;
                    -------------11
                    SQL>SELECT * FROM DATAFILE;---非必要过程(发现存在a 表空间和对应的数据文件)
                    SQL>ALTER DATABASE DATAFILE 5 OFFLINE;
                    SQL>recover database using backup controlfile;---按提示 输入 AUTO 继续。有可能出错(提示找不到某个归档日志)
                    --如果报错说找不的某个归档日志则再次执行recover
                    SQL>recover database using backup controlfile;--同样按提示输入 AUTO继续,并输入确实那个归档日志的路径。
                    --直到恢复完查看是否有那个数据文件
                    SQL>SELECT * FROM V$DATAFILE;
                    -------------11
                    ----11 这个过程可以使用 recover database skip tablespace a 来替换
                    RMAN> ALTER DATABASE OPEN RESETLOGS;
                   
     缺失归档日志情况下的恢复
            1、执行 STARTUP NOMOUNT
            2、执行 RESTORE CONTROLFILE FROM AUTOBACKUP| 'PATH';
            3、执行 执行 recover database 命令 报错提示找不到归档日志
            4、利用 CREATE CONTROLFILE 命令重建控制文件
            5、执行 recover database 命令 若报错提示找不到归档日志
            6、查看V$LOG视图确定第五步中所需那个日志
            7、在SQL/PLUS中执行 RECOVER DATABASE USING BACKUP CONTROLFILE ,等 "Specify log";提示符出现后给出正确的在线日志
                    路径,直到命令结束
            8、以 resetlogs 方式打开数据库。
            9、因为控制文件内不会有临时数据文件信息,所以需重新将其添加会临时表空间
              alter tablespace temp add tempfile  'patj' reuse;
            10、将控制文件内其他丢失的信息用 catalog 和 configure 命令再添加回来。
             catalog db_recovery_file_dest;---如果使用恢复编录则无须执行该过程
           
           
            查看已知的归档日志的最大序列号
            SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
            查询V$LOG视图得知控制文件需要从几号日志开始恢复。
            select sequence# from v$log wher status='CURRENT';
           
           
 noresetlogs
 
    可以不用带 RESETLOGS 关键字打开数据库。方法就是 在 RECOVER DATABASE 成功完成后,重新创建一个新控制文件,
    并在创建的命令中使用 noresetlogs 关键字。主要步骤为:
    1、在执行完 recover database;
    2、SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
    3、重启实例至 nomount 状态。startup force nomount;
    4、用追踪文件中的 noresetlogs 版本的 create controlfile 命令创建新的控制文件,创建完成后会自动进入 MOUNT 状态
    5、执行 ALTER DATABASE OPEN 打开数据库,如果报错,先执行 RECOVER DATABASE  然后在 alter database open 打开数据库
    6、因为控制文件内不会有临时数据文件信息,所以需重新将其添加会临时表空间。
        alter tablespace temp add tempfile  'patj' reuse;
    7、将控制文件内其他丢失的信息用 catalog 和 configure 命令再添加回来。
     catalog db_recovery_file_dest;---如果使用恢复编录则无须执行该过程
     最后使用 configure 命令重新设置通道、备份保留策略等配置信息---同样如果使用恢复编录则无须执行该过程
           
           
                   
                   
                   
                   
           
      

原文地址:https://www.cnblogs.com/jiangu66/p/3174609.html