zoukankan      html  css  js  c++  java
  • Oracle在归档模式下恢复

      ===============

      数据库的完全恢复

      ===============

    在归档模式下数据库完全恢复时,数据库所经过的状态如下:

      1.利用备份修复(Restores)损坏或丢失的数据文件,即将备份的文件复制到数据库中原来的位置

      2. 将从备份到系统崩溃这段时间所提交的数据由归档日志文件和重做日志文件中还原成数据文件所需要的数据块,这也叫前滚(Roll Forward)

      3. 此时数据块中包含了所有提交的数据,也可能包含没提交的数据

      4. 系统利用还原数据块回滚未提交的数据,这也叫回滚或者事务恢复(Recovery)

     总结成公式就是: Restore将数据文件带回到过去(备份时间点)+Recover恢复从备份到数据文件崩溃这段时间所提交的数据  =>数据的完全恢复

     数据恢复时的常用视图

            v$reover_file     --查询需要恢复的文件,该视图信息来自控制文件,如控制文件来自备份或重建过则信息会不准

            v$archived_log    --查询所有归档日志列表

            v$recovery_log    --查询所有需要用于恢复的日志

    配置恢复自动使用归档日志

            在介质恢复前通过设置set autorecovery on来自动应用归档日志实现恢复

            也可以在输入归档日志路径、文件名时输入auto

            使用recover automatic命令

       

      恢复文件到新路径

            使用操作系统命令恢复文件到新位置

            使用alter database rename file '<dir>' to '<dir>'

     

     一、Oracle完全恢复的方法的几种场景:

    A. 数据库处于打开状态下,非系统数据文件丢失的恢复

    适用情形:

      适用于所需要的数据文件不属于系统表空间或还原/回滚段表空间

    主要步骤:

      1. 将数据文件置于脱机状态(alter database datafile n offline;)

      2. 还原数据文件(restore)

      3. 恢复数据文件(recover datafile n)

      4. 使数据文件online (alter database datafile n online;)

      4. 确认数据文件是否处于联机状态了

    实例演示:

    SQL> conn dog/dog
    已连接。
    
    SQL> !rm /u01/app/oracle/oradata/orcl/test.dbf   --删除数据文件
    
    SQL> select * from v$recover_file;         --数据库还不知道数据文件需要恢复
    SQL> alter system switch logfile; --对日志进心归档
    SQL> alter system checkpoint; --执行检查点进程,将数据缓冲区内容写入到文件,因test.dbf已丢失,则告警日志将产生该记录 SQL> select * from v$recover_file; --发现文件丢失,需要恢复 5 OFFLINE OFFLINE FILE NOT FOUND 0

    SQL> alter database datafile 5 offline; SQL> ho cp /u03/backup/hotbak/test.dbf /u01/app/oracle/oradata/orcl/ SQL> recover datafile 5; --恢复数据文件5 完成介质恢复。 SQL> select * from v$recover_file;
    SQL
    > alter database 5 online; SQL> alter database datafile 5 online; --使数据文件联机 SQL> select file#,status from v$datafile; --查看状态 1 SYSTEM 2 ONLINE 3 ONLINE 4 ONLINE 5 ONLINE

    B. 数据库处于关闭状态下的恢复

    适用情形:

     包括系统表空间(系统数据文件)、Undo 表空间、整个数据库

    主要步骤:

    • 关闭实例(shutdown immediate或者shutdown abort;)
    • 还原数据文件
    • 使用归档日志更新到最新
    • 打开数据库

    演示:

    --删除数据库的数据文件

    SQL> !rm /u01/app/oracle/oradata/orcl/*dbf 
    
    SQL> !ls /u01/app/oracle/oradata/orcl/
    control01.ctl  redo01.log  redo02.log  redo03.log

    --关闭数据库

    SQL> conn / as sysdba
    已连接。
    SQL>  shutdown immediate; 
    ORA-00604: 递归 SQL 级别 1 出现错误
    ORA-01116: 打开数据库文件 1 时出错
    ORA-01110: 数据文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
    ORA-27041: 无法打开文件
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 3
    SQL> shutdown abort;
    ORACLE 例程已经关闭。

    --启动数据库

    SQL> startup
    ORACLE 例程已经启动。
    Total System Global Area  805875712 bytes
    Fixed Size            2217672 bytes
    Variable Size          528484664 bytes
    Database Buffers      268435456 bytes
    Redo Buffers            6737920 bytes
    数据库装载完毕。
    ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件 ORA-01110:
    数据文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

    --还原数据文件

    SQL> select * from v$recover_file;
         1 ONLINE  ONLINE  FILE NOT FOUND                            
         2 ONLINE  ONLINE  FILE NOT FOUND                            
         3 ONLINE  ONLINE  FILE NOT FOUND                            
         4 ONLINE  ONLINE  FILE NOT FOUND                            
         5 ONLINE  ONLINE  FILE NOT FOUND                            
    SQL> ho cp /u03/backup/hotbak/*.dbf $ORACLE_BASE/oradata/orcl/

    --恢复数据文件,这里是自动寻取所需要的归档文件

    SQL> recover datafile 1,2;
    完成介质恢复。
    SQL> select * from v$recover_file;
         3 ONLINE  ONLINE                                    2-16 19:11:28
         4 ONLINE  ONLINE                                    2-16 19:11:35
         5 ONLINE  ONLINE                                    2-16 19:11:20
    SQL> recover database;
    完成介质恢复。
    SQL> select * from v$recover_file;

    --打开数据库

    SQL> alter database open;

    C.数据初始状态处于关闭状态下由于硬件故障,且需要在打开状态下的恢复(非系统数据文件)

            启动到mount状态

            将受损的数据文件offline

            打开数据库

            还原受损的数据文件(restore)

            恢复受损的数据文件(recover)

            将受损的数据文件online

           

            此场景类似于A场景仅仅是需要先启动到mount状态,然后再将受损的数据文件脱机,并打开数据库,使之能提供服务.因此该演示省略.

     

    D.数据文件无备份情况下的恢复

    适用场景:

      所需要恢复的数据文件属于非系统表空间

      控制文件未被重新创建或恢复到以前的版本(丢失数据文件的描述信息应在数据字典和控制文件中)

           该数据文件从文件开始到丢失期间的所有日志必须存在

    如果那个公司使用了这种方法,说明该公司的数据库管理维护很混乱。

     

    步骤:-->先将丢失数据文件脱机-->重建数据文件-->应用归档日志-->联机恢复的数据文件

     

    Oracle提供如下两个方法重建这个数据文件的结构命令:

        alter database create datafile 'filename';

                alter database create datafile 'filename' as 'new file name'; --可以放置到不同目录,一般用于原文件所在的目录已经损坏了

     

    实例演示:

    SQL> create table tb_bk2(id int,name varchar2(10)) tablespace bk2;
    SQL> insert into tb_bk2 values(1,'Dand');
    SQL> commit;
    SQL> alter system checkpoint;
    SQL> alter system switch logfile;
    SQL> ho rm $ORACLE_BASE/oradata/orcl/bk02.dbf    --模拟数据文件被损坏
    
    SQL> insert into tb_bk2 values(2,'Luck');
    SQL> commit;
    
    SQL> alter database datafile 6 offline;   --使数据文件离线
    SQL> select * from v$recover_file;
         6 OFFLINE OFFLINE FILE NOT FOUND                                0
    SQL> alter database create datafile 6;    --重建数据文件
    
    SQL> recover datafile 6;
    完成介质恢复。
    SQL> alter database datafile 6 online;
    SQL> select * from tb_bk2;
         1 Dand
         2 Luck

    二、数据库的不完全恢复

    不完全恢复的几种常用方法:

            recover database until cancel;                       --SQLPlus使用

            recover database until time '2009-10-09:14:20:45'    --SQLPlus与RMAN都支持

            recover database unitl time '2009-10-09:14:20:45' using backup controlfile

            recover database until change 329102      --SQLPlus使用

            recover database until scn 329102         --RMAN使用

            recover database until sequence  10       --RMAN使用

    其实,这种不完全恢复很多都可用闪回技术进行恢复。

     

    演示基于until time的恢复

    先做一次冷备  脚本在:Oracle冷备份及其恢复

     
    SQL> @coolbak.sql

    在一个表里插入数据,并记录下时间

    SQL> conn dog/dog
    已连接。
    
    
    SQL> create table users(id int,name varchar(20));
    
    表已创建。
    
    
    SQL> insert into users values(1,'Scott');
    
    已创建 1 行。
    
    SQL> commit;
    
    提交完成。
    
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    
    TO_CHAR(SYSDATE,'YY
    -------------------
    2016-12-17 02:35:24
    
    SQL> insert into users values(2,'Keven');
    
    已创建 1 行。
    
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    
    TO_CHAR(SYSDATE,'YY
    -------------------
    2016-12-17 02:36:17
    
    SQL> commit;
    
    提交完成。

    关闭数据库,删除掉数据文件并从冷备中恢复过来

    SQL> conn / as sysdba
    已连接。
    SQL> shutdown abort;
    ORACLE 例程已经关闭。
    SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf
    
    SQL>  ho cp /u03/backup/coolbak/*.dbf $ORACLE_BASE/oradata/orcl/

    查看控制文件中记录的检查点和备份的数据文件头记录的检查点,并恢复到指定时间点

    SQL> startup mount;
    ORACLE 例程已经启动。
    
    Total System Global Area  805875712 bytes
    Fixed Size            2217672 bytes
    Variable Size          549456184 bytes
    Database Buffers      247463936 bytes
    Redo Buffers            6737920 bytes
    数据库装载完毕。
    SQL> select file#,checkpoint_change# from v$datafile;
    
         FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
         1          1094320
         2          1094320
         3          1094320
         4          1094320
         5          1094320
         6          1094320
    
    已选择6行。
    
    SQL> select file#,checkpoint_change# from v$datafile_header;
    
         FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
         1          1073554
         2          1073554
         3          1073554
         4          1073554
         5          1073554
         6          1073554
    
    已选择6行。
    
    SQL> recover database until time '2016-12-17 02:35:24';
    完成介质恢复。

    --使用resetlogs方式打开数据库,并查看表中的数据是否恢复到了指定的时间点

    SQL> alter database open resetlogs;
    
    数据库已更改。
    SQL> conn dog/dog
    已连接。
    SQL> select * from users;
    
        ID NAME
    ---------- --------------------
         1 Scott

    可以看出确实恢复到了指定的时间点

    --再次查看文件头,是否也已经一致了。

    SQL> select file#,checkpoint_change# from v$datafile;
    
         FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
         1          1094761
         2          1094761
         3          1094761
         4          1094761
         5          1094761
         6          1094761
    
    已选择6行。
    
    SQL> select file#,checkpoint_change# from v$datafile_header;
    
         FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
         1          1094761
         2          1094761
         3          1094761
         4          1094761
         5          1094761
         6          1094761
    
    已选择6行。

    基于Until Cancel的不完全恢复

    做好冷备

    SQL> start /u03/backup/coolbak.sql
    QL> conn dog/dog
    Connected.
    SQL> select * from person;
    
        ID NAME
    ---------- --------------------
         1 Keven
    
    SQL> insert into person values(2,'Scott');
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> alter system switch logfile;       --将日志写进归档
    
    System altered.
    
    SQL> host strings /u03/ARCHLOG/1_2_930793088.dbf|grep Scott    --归档中已经存在Scott记录
    Scott
    
    SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott   --未执行检查点时,数据文件中不存在Scott记录
    
    SQL> alter system checkpoint;                      --执行检查点进程
    System altered.
    
    SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott  --执行后,数据文件中存在Scott记录
    Scott  
    
    SQL> insert into person values(3,'Jack');                --将Jack这条数据写进数据文件中,但是没有写到归档日志文件中    
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> alter system checkpoint;
    
    System altered.
    
    SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Jack
    Jack,
    
    SQL> alter database backup controlfile to trace as '/tmp/control.sql';    --备份控制文件
    
    Database altered.
    
    SQL> ho rm -f $ORACLE_BASE/oradata/orcl/*                  -- 数据文件,控制文件,日志文件将全部丢失
    
    SQL> conn / as sysdba
    Connected.
    SQL> shutdown abort                               --强制关机
    ORACLE instance shut down.
    
    SQL> host cp /u03/backup/coolbak/*.dbf /$ORACLE_BASE/oradata/orcl/    --仅对数据文件进行还原

    --修改前面备份的控制文件如下,手动来创建控制文件

    vim /tmp/control.sql

    STARTUP NOMOUNT
    CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
    LOGFILE
      GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
      GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
      GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
    -- STANDBY LOGFILE
    DATAFILE
      '/u01/app/oracle/oradata/orcl/system01.dbf',
      '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
      '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
      '/u01/app/oracle/oradata/orcl/users01.dbf',
      '/u01/app/oracle/oradata/orcl/test.dbf',
      '/u01/app/oracle/oradata/orcl/bk02.dbf'
    CHARACTER SET AL32UTF8
    ;

    --执行重建控制文件的脚本

    SQL> shutdown abort
    ORACLE instance shut down.
    SQL> start /tmp/control.sql
    ORACLE instance started.
    
    Total System Global Area  805875712 bytes
    Fixed Size            2217672 bytes
    Variable Size          595593528 bytes
    Database Buffers      201326592 bytes
    Redo Buffers            6737920 bytes
    
    Control file created.

     --恢复文件

    SQL> recover database using backup controlfile until cancel;
    ORA-00279: change 1075471 generated at 12/20/2016 19:59:42 needed for thread 1
    ORA-00289: suggestion : /u03/ARCHLOG/1_1_931117309.dbf
    ORA-00280: change 1075471 for thread 1 is in sequence #1
    
    
    Specify log: {<RET>=suggested | filename | AUTO | CANCEL}    --1_1_931117309.dbf不存在,还没有生成归档,而是在联机日志文件中,联机日志丢失,输入cancel 
    cancel
    Media recovery cancelled.
    SQL
    > alter database open resetlogs;

    Database altered.
    SQL
    > alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' 2 size 31457280 reuse autoextend on;
    Tablespace altered.

      

  • 相关阅读:
    通过进程ID获取基地址
    怎样获得某个进程的内存基地址?
    Delphi来实现一个IP地址输入控件
    如何在Windows服务程序中添加U盘插拔的消息
    delphi Format格式化函数
    CRC8算法DELPHI源码
    实现控件的透明背景
    定制控件背景颜色与背景位图
    实现系统滚动条换肤功能
    Delphi 获取命令行输出的函数
  • 原文地址:https://www.cnblogs.com/zydev/p/6184348.html
Copyright © 2011-2022 走看看