zoukankan      html  css  js  c++  java
  • oracle之三手工完全恢复

    手工完全恢复

    3.1 完全恢复;通过备份、归档日志、current log ,将database恢复到failure 前的最后一次commit状态。

    3.2 完全恢复的步骤

    1)restore: OS拷贝命令还原所有或部分datafile
    2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复

    3.3 手工完全恢复可以基于三个级别

    recover database: 包括system表空间损坏或大部分datafile丢失,一般是在mount状态完成
    recover tablespace: 非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成
    recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成

    什么是关键文件:如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

    考点:哪些文件是关键文件:四个:1)system01.dbf, 2) undo tablespace,3)control file 4)current log file

    3.4 恢复过程可以查看的视图:

    1)v$recover_file: 查看需要恢复的datafile
    2)v$recovery_log: 查看recover 需要的redo 日志
    3)v$archvied_log: 查看已经归档的日志

    3.5 非归档模式下只能做全备的完整还原,还原后仍会缺失联机日志文件(因为只备数据文件和控制文件),需要在mount下发出
    alter database clear logfile group <组号>. (如果是在RMAN下还原,这一过程是自动完成的)。

    3.6 手工完全恢复的实验

    前提: 1)有一套datafile全备, 2)使用当前控制文件, 3)自上次备份以来的归档日志和当前联机日志是完整的。

    范例1:recover database 说明:由于media failure 所有datafile丢失,

    sys:
    SQL> select * from scott.test;

    ID
    ----------
    1

    在这个状态下先在OS下做一个数据文件和控制文件的冷备。

    SQL> shutdown immediate

    [oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf /u01/back1
    [oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl /u01/back1

    [oracle@timran ~] $startup

    SQL> insert into scott.test values(2);
    SQL> commit;
    SQL> select * from scott.test;

    ID
    ----------
    2
    1

    SQL> insert into scott.test values(3);
    SQL> select * from scott.test;

    ID
    ----------
    2
    3 //这条记录未提交,恢复时会回滚掉
    1

    1)模拟介质失败,所有数据文件丢失

    [oracle@timran ~]$ rm /u01/oradata/timran11g/system01.dbf //数据库在打开的情况下就删掉了所有dbf文件
    $sqlplus / as sysdba //换个session登录,然后关闭数据库
    SQL> shutdown abort //数据库直接abort了

    2)启动database,报错!

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

    3)首先还原system01.dbf数据文件

    [oracle@timran ~]$ cp /u01/back1/system01.dbf /u01/oradata/timran11g

    比较控制文件和数据文件头的SCN

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

    4)恢复database

    SQL> recover database;

    5)打开数据库

    SQL> alter database open;

    6)验证

    SQL> select * from scott.test;

    ID
    ----------
    2
    1

    范例2:recover tablespace(状态:database open)

    说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复

    模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃, 我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

    恢复表空间(删除了tablespace下的所有的datafile)

    1)了解一下当前状态,在test表空间上建立scott.t1表,

    SQL> conn scott/scott
    SQL> create table t1 (id int) tablespace test;
    SQL> insert into t1 values(1);
    SQL> commit;
    SQL> select * from t1;

    NAME
    --------------------------------------------------
    1

    2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件
    [oracle@timran ~]$ rm /u01/oradata/timran11g/test01.dbf
    [oracle@timran ~]$

    3)查证该表空间上的表不可访问了

    SQL> alter system flush buffer_cache; //清除data buffer

    SQL> conn / as sysdba //换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!
    SQL> select * from scott.t1;

    4)看看scn的情况

    SQL> select file#,checkpoint_change# from v$datafile;

    FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
    1 3550907
    2 3550907
    3 3550907
    4 3550907
    5 3550907
    6 3550339

    SQL> select file#,checkpoint_change# from v$datafile_header;

    FILE# CHECKPOINT_CHANGE#
    ---------- ------------------
    1 3550907
    2 3550907
    3 3550907
    4 3550907
    5 3550907
    6 0

    5)test表空间offline

    SQL> alter tablespace test offline immediate; //immediate使表空间能立即脱机,不等Oracle对任何数据文件做检查

    6)数据库open下,使用备份还原这个表空间下的所有数据文件

    [oracle@timran ~]$ cp /u01/back1/test01.dbf /u01/oradata/timran11g

    7)恢复tablespace

    SQL> recover tablespace test;

    8)使表空间online

    SQL> alter tablespace test online; //注意:此时数据库状态一直是open的。

    9)验证

    SQL> select * from scott.t1;

    ID
    --------------------------------------------------
    1


    范例3:(recover datafile,database mount或open状态)

    恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

    1) 模拟环境:

    SQL> insert into scott.t1 values(2); //插入一行记录是为了使t1和备份有区别
    SQL> commit;
    SQL> select * from scott.t1;

    ID
    --------------------------------------------------
    1
    2

    SQL> delete scott.t1; //注意:删掉了t1并没有提交,老值在UNDO里。

    2)在open 状态下删除datafile
    [oracle@timran ~]$ rm /u01/oradata/timran11g/undotbs01.dbf
    [oracle@timran ~]$

    3)关闭数据库
    SQL> shtudown abort //abort埋下伏笔,等到完全恢复时会做UNDO回滚。

    4)启动数据库mount
    SQL> startup mount
    ...
    数据库装载完毕。
    ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
    ORA-01110: 数据文件 3: '/u01/oradata/timran11g/undotbs01.dbf'

    5)还原并恢复UNDO数据文件

    [oracle@timran timran11g]$ cp /u01/back1/undotbs01.dbf ./

    SQL> recover datafile 3;
    完成介质恢复。

    6)打开数据库(会完成UNDO表空间数据的回滚)

    SQL> alter database open;

    数据库已更改

    7) 验证
    SQL> select * from scott.t1;

    ID
    --------------------------------------------------
    1
    2


    3.7 手工完全恢复特点小结:

    3.7.1 recover database (system01.dbf或大部分数据文件损坏,mount下进行)

    OS: 使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)
    SQLPLUS:
    1)recover database;
    2)alter database open;

    3.7.2 recover tablespace (针对表空间的非关键数据文件损坏,一般是open下进行)

    OS:使用cp 还原该表空间XXX下的所有数据文件
    SQLPLUS:
    1)alter tablespace XXX offline;
    2)recover tablespace XXX;
    3)alter tablespace XXX online;

    3.6.3 recover datafile (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)

    OS:使用cp 还原相关的关键数据文件(mount)
    SQLPLUS:
    1)recover datafile 6,8;
    2)alter database open;

    OS:使用cp 还原相关的非关键数据文件(open)
    SQLPLUS:
    1)alter database datafile 6,8 offline;
    2)recover datafile 6,8;
    3)alter database datafile 6,8 online;

  • 相关阅读:
    开窗函数Over
    CodeSmith
    codeMatic代码生成器
    Mvc身份认证方式
    Neo4j入门详细教程
    pathlib路径问题
    python_跨文件二维全局变量传参
    .md图片链接转存并替换路径,及相关报错解决方法
    ERROR: column "xxxxxx" does not exist解决办法
    SCP远程传输文件
  • 原文地址:https://www.cnblogs.com/jinxf/p/9171308.html
Copyright © 2011-2022 走看看