zoukankan      html  css  js  c++  java
  • OCA读书笔记(16)

    16. Performing Database Recovery

    确定执行恢复的必要性
    访问不同接口(EM以及命令行)
    描述和使用可用选项,如RMAN和Data Recovery Advisor
    执行恢复
    -控制文件(control file)
    -重做日志文件(redo log file)
    -数据文件(data file)

    打开数据库
    NoMount: 从ShutDown->NoMount, 读取初始化参数文件(pfile),不检查数据库文件
    Mount: 从NoMount->Mount,检查参数文件中所列的控制文件是否存在并且同步,任一控制文件丢失,实例均会返回错误并且保持在NoMount状态
    Open: 从Mount->Open,检查控制文件中所列的重做日志组是否至少存在一组,任何丢失的日志组成员均会被记录到警告日志;检查控制文件中所列的没有offline的数据文件是否存在,如果有文件丢失,会报告包含第一个丢失的文件信息的错误,需要检查v$recover_file获取所有丢失的文件
    SQL> SELECT name, error
      2  FROM v$datafile
      3  JOIN v$recover_file
      4  USING (file#);

    保持数据库在打开状态
    介质错误会导致实例错误:如丢失控制文件,丢失重做日志文件的一个组(即使是inactive的组)或者丢失属于SYSTEM和UNDO表空间的一个数据文件
    很多时候,实例错误必能全完关闭数据库,在进行恢复之前,需要管理员应用SHUTDOWN ABORT命令

    Data Recovery Advisor当前仅支持单实例,不支持RAC。
    rman target /
    rman> list failure all;

    V$IR_FAILURE: Listing of all failures, including closed ones (result of the LIST FAILURE command)
    V$IR_MANUAL_CHECKLIST: Listing of manual advice (result of the ADVISE FAILURE command)
    V$IR_REPAIR: Listing of repairs (result of the ADVISE FAILURE command)
    V$IR_FAILURE_SET: Cross-reference of failure and advise identifiers

    数据库恢复
    1.丢失一份控制文件
    如果控制文件存储在ASM磁盘组,恢复选项如下:
    1).使用EM根据向导执行恢复
    2).将数据库置于NoMount模式,然后应用RMAN从现有控制文件中恢复
    RMAN> restore controlfile from '+DATA/orcl/controlfile/current.260.695209463';
    如果控制文件存储在普通文件系统
    1).关闭数据库
    2).拷贝现有控制文件来替代丢失的控制文件
    当控制文件成功恢复之后,打开数据库

    2.丢失某重做日志文件组中的一份重做日志文件
    从文件组中删除文件,然后重新添加文件
    SQL> ALTER DATABASE DROP LOGFILE MEMBER '+DATA/orcl/onlinelog/group_1.261.691672257';
    SQL> ALTER DATABASE ADD LOGFILE MEMBER '+DATA' TO GROUP 2;
    清空日志组以重建丢失的文件
    SQL> ALTER DATABASE CLEAR LOGFILE GROUP #;
    SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #;

    3.在非归档模式下丢失一份数据文件
    1).如果数据库没有关闭,则关闭数据库
    2).从备份中恢复整个数据库,包括所有数据文件和控制文件
    3).打开数据库
    4).让用户重新录入自从上次备份以来所做的改变

    4.在归档模式下丢失一份非关键数据文件
    在归档模式下,丢失不属于SYSTEM和UNDO表空间的数据文件,仅影响所在数据文件的对象。
    1).在EM的维护页面点击执行恢复
    2).选择数据文件作为恢复类型(Object Type),然后选择"Restore to current time"
    3).添加所有需要恢复的数据文件
    4).决定恢复的数据文件位于默认位置或者新的位置(在硬盘或者控制文件丢失的情况下)
    5).提交RMAN操作以恢复丢失的文件

    实验:普通表空间,比如users,文件丢失的恢复

    模拟损坏:
    [oracle@oracle ~]$ sqlplus scott/tiger
    create table e as select * from emp;

    !rm -rf /u01/app/oracle/oradata/orcl/users01.dbf
    select * from e;

    conn /as sysdba
    alter system flush buffer_cache;

    conn scott/tiger
    select * from e;

    conn /as sysdba
    alter database datafile 4 offline;

    !cp -v /u01/app/oracle/backup/hotbk/users01.dbf /u01/app/oracle/oradata/orcl
    recover datafile 4;

    alter database datafile 4 online;

    conn scott/tiger
    select * from e;

    发现e表没有丢失,完全恢复

    实验:未备份的数据文件丢失的恢复

    conn /as sysdba
    create tablespace t datafile '/u01/app/oracle/oradata/orcl/t01.dbf' size 1M;

    conn scott/tiger
    create table t tablespace t as select * from dept;

    !rm -rf /u01/app/oracle/oradata/orcl/t01.dbf

    SQL>conn /as sysdba
    SQL>alter system flush buffer_cache;

    SQL>alter database datafile 6 offline;
    SQL>alter database create datafile 6;--根据控制文件创建数据文件

    SQL>select creation_change# from v$datafile where file#=6;--发现恢复的起点是这个文件的创建scn

    SQL>recover datafile 6;--直接应用联机redo进行恢复
    SQL>select group#, sequence#, status, first_change# from v$log;

    SQL>select checkpoint_change# from v$datafile_header where file#=6;
    SQL>select checkpoint_change#, last_change# from v$datafile where file#=6;

    SQL>alter database datafile 6 online;--一致,online成功

    5.在归档模式下丢失一份关键数据文件
    1).如果数据库没有关闭,关闭数据库(SHUTDOWN ABORT)
    2).Mount数据库
    3).执行4中的相同步骤以恢复丢失的文件
    4).打开数据库

    实验: system表空间的数据文件丢失

    模拟破坏:

    sqlplus / as sysdba
    create table big_t as select * from dba_objects;

    !rm -rf /u01/app/oracle/oradata/orcl/system01.dbf
    alter system flush buffer_cache;

    恢复:关闭数据库,启动到mount:由于不能正常关闭,只能杀进程:
    [oracle@oracle u01]$ ps -ef | grep dbw
    oracle 4410 1 0 08:20 ? 00:00:00 ora_dbw0_orcl
    oracle 4620 4478 0 08:27 pts/2 00:00:00 grep dbw
    [oracle@oracle u01]$ kill -9 4410

    startup
    select file#,error,change#,time from v$recover_file;

    查看检查点scn:
    ORA10G>select checkpoint_change#, last_change# from v$datafile where file#=1;
    ORA10G>select checkpoint_change# from v$datafile_header where file#=1;

    将system表空间的备份拷贝至文件所在的位置:
    !cp -v /u01/app/oracle/backup/hotbk/system01.dbf /u01/app/oracle/oradata/orcl
    alter database open; --error

    select checkpoint_change#, last_change# from v$datafile where file#=1;
    select checkpoint_change# from v$datafile_header where file#=1;
    CHECKPOINT_CHANGE#
    ------------------
    1162060

    通过备份点找到恢复时应用的第一个归档日志文件:

    ORA10G>select name from v$archived_log where 1162060 between FIRST_CHANGE# and NEXT_CHANGE#;

    NAME
    --------------------------------------------------------------------------------
    /u01/app/oracle/archivelog/1_59_816604382.dbf

    recover datafile 1;
    auto

    alter database open;

    select count(*) from big_t;

    发现big_t仍然存在,是完全恢复

    实验:undo表空间文件丢失的恢复

    模拟损坏:
    create table e as select * from emp;
    !rm -rf /u01/app/oracle/oradata/orcl/undotbs01.dbf

    conn /as sysdba
    alter system flush buffer_cache;

    conn scott/tiger
    update e set sal=sal+100;

    关闭数据库并启动到Mount
    conn /as sysdba
    shutdown abort
    startup mount

    将数据文件拷回相应位置
    !cp -v /u01/app/oracle/backup/hotbk/undotbs01.dbf /u01/app/oracle/oradata/orcl/

    恢复数据文件
    recover datafile 2;
    auto

    alter database open;
    conn scott/tiger
    select * from tab;

    实验:所有数据文件全部丢失

    模拟损坏:
    SQL>conn scott/tiger
    create table e as select * from emp;
    SQL>exit

    [oracle@oracle ~]$ cd $ORACLE_BASE/oradata/orcl
    [oracle@oracle orcl]$ rm -rf *dbf

    [oracle@oracle orcl]$ sqlplus / as sysdba
    SQL>alter system flush buffer_cache;
    SQL>conn scott/tiger
    SQL>exit

    [oracle@oracle orcl]$ ps -ef | grep dbw
    oracle 5056 1 0 08:46 ? 00:00:00 ora_dbw0_orcl
    oracle 15510 14808 0 10:40 pts/1 00:00:00 grep dbw
    [oracle@oracle orcl]$ kill -9 5056

    [oracle@oracle orcl]$ sqlplus / as sysdba
    SQL>startup

    SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl
    SQL>recover database;--开始恢复
    auto

    SQL>select file#,error,change# from v$recover_file;

    SQL>select checkpoint_change#,last_change# from v$datafile;
    SQL>select checkpoint_change# from v$datafile_header;

    SQL>alter database open;--因为一致了,所以打开了

    SQL>conn scott/tiger
    SQL>select * from e;

    6. 不完全恢复 

    实验:基于scn的不完全恢复:

    首先模拟损坏:
    conn scott/tiger
    drop table emp purge;

    首先通过日志挖掘,找到误删除的时间点
    select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

    SQL>execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log')
    execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log')
    execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log')

    启动挖掘:
    execute dbms_logmnr.start_logmnr();

    查询误删除的scn:
    select SCN,SQL_REDO from v$logmnr_contents where SEG_OWNER='SCOTT' AND TABLE_NAME='EMP' and sql_redo like '%drop table emp%';

    SQL>shutdown immediate
    SQL>startup mount;

    SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl--拷贝所有数据文件的备份:
    SQL>recover database until change 1236777 --将数据库恢复到误操作的前一时刻
    auto

    SQL>alter database open resetlogs;

    实验:基于cancel的不完全恢复

    [oracle@oracle ~]$ sqlplus / as sysdba

    SQL>shutdown abort
    SQL>startup mount;

    SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl

    SQL>recover database;--此时进行完全恢复,但是当前日志丢失,所以不能进行完全恢复
    auto

    SQL>recover database until cancel--实施基于cancel的不完全恢复,数据库只能恢复到丢失的日志
    cancel

    SQL>alter database open resetlogs;--要以resetlogs的方式打开数据库,发现日志没了,oracle会以控制文件记录的日志文件重建日志文件

    实验:使用备份的控制文件的不完全恢复
    主要是针对于误删除表空间的不完全恢复:

    1)使用现有控制文件进行恢复:

    模拟损坏:
    SQL>create tablespace tt datafile '/u01/app/oracle/oradata/orcl/tt01.dbf' size 1M;
    SQL>conn scott/tiger
    SQL>create table tt tablespace tt as select * from dept;

    执行全备:
    [oracle@oracle u01]$ ./userback.sh

    [oracle@oracle u01]$ sqlplus / as sysdba
    SQL>drop tablespace tt including contents and datafiles;
    SQL>alter system switch logfile;

    select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

    SQL>execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log')
    execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log')
    execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log')

    SQL>exec dbms_logmnr.start_logmnr();
    select SCN,SQL_REDO from v$logmnr_contents where sql_redo like '%drop%';
    485780

    SQL>shutdown immediate
    SQL>startup mount

    SQL>!cp -v /u01/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl
    SQL>recover database until change 485780
    auto

    SQL>alter database open resetlogs;

    SQL>conn /as sysdba
    SQL>select tablespace_name,file_name from dba_data_files;

    发现tt表空间的文件名已经于之前不一样,因为tt表空间被删除了,控制文件中没有tt表空文件的记录
    所以在恢复的过程中oracle自定义了tt表空间文件的名称

    需要重新对tt表空间的文件进行命名:
    SQL>alter tablespace tt rename datafile '/u01/app/oracle/product/11.2/db_1/dbs/MISSING00006' to '/u01/app/oracle/oradata/orcl/tt01.dbf';

    SQL>alter tablespace tt offline;--此时需要恢复

    SQL>recover datafile 6;
    auto

    SQL>alter tablespace tt online;


    2)使用备份的控制文件进行恢复:

    重新对数据库做备份:
    ./userback.sh

    SQL>drop tablespace tt including contents and datafiles;
    SQL>select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

    SQL>exec dbms_logmnr.start_logmnr();
    SQL>select SCN,SQL_REDO from v$logmnr_contents where sql_redo like '%drop%';
    486128

    SQL>shutdown immediate
    SQL>startup nomount

    SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control01.ctl
    SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control02.ctl
    SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control03.ctl

    SQL>alter database mount;
    SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl

    SQL>recover database until change 486128 using backup controlfile
    auto

    SQL>recover database until change 486128 using backup controlfile
    cancel

    SQL>alter database open resetlogs;
    SQL>select tablespace_name,file_name from dba_data_files;

  • 相关阅读:
    纯数学教程 Page 325 例LXVIII (12)
    纯数学教程 Page 325 例LXVIII (11) Math.Trip.1927,1928
    纯数学教程 Page 325 例LXVIII (11) Math.Trip.1927,1928
    纯数学教程 Page 325 例LXVIII (9)
    纯数学教程 Page 325 例LXVIII (14) $\frac{1}{1^2}+\frac{1}{3^2}+\frac{1}{5^2}+\cdots=\frac{3}{4}(\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots)$
    纯数学教程 Page 325 例LXVIII (14) $\frac{1}{1^2}+\frac{1}{3^2}+\frac{1}{5^2}+\cdots=\frac{3}{4}(\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots)$
    纯数学教程 Page 325 例LXVIII (13)
    纯数学教程 Page 325 例LXVIII (12)
    纯数学教程 Page 325 例LXVIII (9)
    纯数学教程 Page 325 例LXVIII (13)
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3382551.html
Copyright © 2011-2022 走看看