zoukankan      html  css  js  c++  java
  • Oracle11g:数据库恢复总结

    此文转载自:https://blog.csdn.net/ChenHui_Felix/article/details/113624692#commentBox

    一、参数文件

    1、操作系统文件复制

    如果使用操作系统命令复制过参数文件,还原只要复制回去就行。

    2、备份集恢复

    rman恢复需要启动实例,SQL*PLUS在没有参数文件的情况下不能打开,但是rman可以在没有参数文件的情况下,通过内置的参数打开。

    RMAN> startup nomount;

    手动备份恢复

    RMAN> restore spfile from '/xxx/xxx/xxxx/xxxx';

    如果使用了快速恢复区,自动备份,可以使用以下命令

    RMAN> restore spfile from autobackup db_name=orcl  db_recovery_file_dest='/xxx/xxxx/';

    如果没有使用快速恢复区,控制文件保存在dbs目录下。可以通过指定DBID

    RMAN> set dbid 1112231231231;

    RMAN> restore spfile from autobackup;

    启动实例

    SQL> startup force;

    3、实例没有关闭的情况下恢复

    先从自动备份中获取spfile到临时目录,然后通过操作系统命令进行替换。

    RMAN> restore spfile to '/home/oracle/spfileorcl.ora' from autobackup;

    $ cp /home/oracle/spfileorcl.ora $ORACLE_HOME/dbs

    二、控制文件

    数据库访问控制文件,读取参数文件中配置的第一个控制文件,写所有的控制文件。所以,第一个控制文件出问题,读写操作都会出问题。其他控制文件出问题,只有写操作才会出错。

    数据库启动时候,控制文件损坏,会报ORA-00205(识别控制文件有误)或者ORA-00227(控制文件存在坏块)。

    实例open,控制文件损坏,但是不能保证所有功能正常。直到CKPT发起检查点的时候,实例最终被强制关闭。遇到这种情况,立刻提交所有操作commit,然后等实例自动关闭或者shutdown abort。

    建议开启自动备份,在数据库物理结构发生变化的时候都会自动备份。

    RMAN> configure controlfile autobackup on;

    控制文件恢复的时候,虽然可以通过start nomount命令启动,但是建议以startup命令,使数据库产生更多有价值的信息。

    1、在线副本

    控制文件存在多个副本,存在没有损坏的副本。首先对所有的文件通过操作系统文件复制保持。

    将损坏的文件替换成完好的文件,启动数据库。

    2、结构备份,数据库结构相同,但是检查点和SCN等信息比较旧,这里就是开启了控制文件自动备份。

    数据库到nomount状态

    RMAN> resotre controlfile from autobackup;

    RMNA> mount database;

    RMAN> recover database;

    RMAN> alter database open resetlogs;

    3、历史备份,所有的信息都不一致

    (1)备份了控制文件后,创建了添加了表空间,添加日志组,删除日志组。

    这种recover可以自动修复。

    RMAN> resotre controlfile from '/xxx/xxx';

    RMAN> mount database;

    RMAN> recover database;

    RMAN> alter database open resetlogs;

    (2)备份控制文件后,删除表空间

    RMAN> resotre controlfile from '/xxx/xxx';

    RMAN> mount database;

    SQL> alter database datafile 6 offline;                     #将删除表空间的文件都下线

    SQL> recover database using backup controlfile;    #输入AUTO

    可能再次报错,提示没有归档日志,其实是某个还没来得及归档的在线日志,通过查询可以得知是某个在线日志。再次执行命令

    SQL> recover database using backup controlfile;    #输入查询出来的在线日志路径

    或者使用跳过表空间的方式

    RMAN> recover database skip tablespace examples;

    RMAN> alter database open resetlogs;

    4、缺失归档日志

    确认问题只和控制文件相关,如果数据文件损坏就需要不完全恢复。

    恢复控制文件,加载到mount状态后

    RMAN> recover database;

    报错,显示找不到归档。

    SQL> alter database backup controlfile to trace;

    SQL> select value from v$diag_info where name='Default Trace File';

    SQL> startup force nomount;

    在追踪文件中找到NORESETLOGS的创建语句,并执行后,数据库已经到mount状态。

    RMAN> recover database;

    再次报错,提示找不到归档日志,但是此时的归档日志和上面不一样,这是因为恢复只查找归档日志,无视了在线日志。

    SQL> recover database using backup contrilfile;    #输入在线日志路径

    SQL> alter database open resetlogs;

    SQL> alter tablespace temp add tempfile '/xxx/xxx/xxx/xx.dbf' reuse;

    三、数据文件

    1、关键数据文件损坏(system表空间和撤销表空间),一定是在mount状态下恢复。

    如果实例没有崩溃使,则先关闭

    SQL> shutdown abort;

    关键数据文件损坏可能登陆不了数据库,需要手动关闭进程。

    kill -9 `ps aux |grep ora_smon_orcl |grep -v grep | wak '{pring $2}'`

    恢复system数据文件

    run{

    startup mount;

    restore datafile 1;

    recover database;

    alter database open;

    }

    2、普通数据文件损坏,可以在open状态下恢复

    除了system表空间、undo_tablespace表空间、临时表空间和只读表空间,属于普通数据文件,损坏后最多导致用户数据不可访问,不会导致数据库异常。

    启动时候发现普通数据文件不存在或者头部损坏,可以先让该文件下线,数据库能正常启动。

    SQL> alter database datafile 5 offline;

    SQL> alter database open;

    如果数据库运行的时数据库文件头损坏,发生检查点的时候会强制将这个文件下线,此时重启能正常重启。

    (1)如果数据文件没有强制下线

    可以关闭实例进行恢复

    run{

    shutdown abort;

    startup mount;

    restore datafile ''/xxx/xxxx/dd.dbf;

    recover database;

    alter database open;

    }

    也可以在实例启动的时候进行恢复

    run{

    sql 'alter database datafile 5 offline';

    restore datafile 5;

    recover datafile 5;

    sql 'alter database datafile 5 online'

    }

    如果实例已经关闭,提高数据库可用性的情况下,先启动数据库实例

    run{

    startup mount;

    sql 'alter database datafile 5 offline';

    alter database open;

    restore datafile 5;

    recover datafile 5;

    sql 'alter database datafile 5 online';

    }

    (2)数据文件被强制下线

    数据文件的头部损坏后,检查点要强制将文件下线,恢复这个文件的时候会报错。

    采用启动实例到mount,然后使数据文件在线,然后恢复的方式。

    run{

    shutdown abort;

    startup mount;

    sql 'alter database datafile 5 online';

    resotre datafile 5;

    recover database;

    alter database open;

    }

    (推荐)删除数据文件,在数据库open的状态下恢复。

    rm -rf /eee/ddd/xxx.dbf

    run{

    sql 'alter database datafile 5 offline';

    restore datafile 5;

    recover datafile 5;

    sql 'alter database datafile 5 online';

    }

    3、只读数据文件

    只读文件损坏后,检查点不会对只读文件进行操作,实例不会崩溃,也不会强制下线。

    和普通文件恢复的区别:只读状态不变的情况下,不需要recover,在修改只读状态的情况下,可能需要两次recover。

    在只读表空间备份了控制和数据文件,后来改为读写,数据文件和控制文件损坏了,没有最新的备份。重启数据库到nomount状态

    从备份中还原控制文件,这时候控制文件记录的表空间为只读。

    启动到mount,还原数据文件。

    第一次recover database恢复了控制文件,但是此时表空间记录为只读,所以忽略了。

    第二次recover database通过最新的控制文件恢复表空间。

    四、不完全数据库恢复

    归档或者active的在线日志、current的在线日志丢失或者损坏。

    认为操作错误想要回退到某个时间点。

    恢复到指定的日志

    run{

    startu force mount;

    set until sequence 100;

    restore database;

    recover database;

    alter database open resetlogs;

    }

    到指定时间

    set until time "sysdate-interval '10' minute";

       

    更多内容详见微信公众号:Python测试和开发

    Python测试和开发

  • 相关阅读:
    0045 Spring中使用DataSourceTransactionManager进行事务管理的xml配置
    0044 spring框架的applicationContext.xml的命名空间
    0042 MySQL学习笔记-入门--01
    0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
    0040 Java学习笔记-多线程-线程run()方法中的异常
    0039 Java学习笔记-多线程-线程控制、线程组
    ThinkPHP5.0 实现 app微信支付功能
    Thinkphp5.0分页和跳页
    php header函数导出excel表格
    php之微信公众号发送模板消息
  • 原文地址:https://www.cnblogs.com/phyger/p/14377825.html
Copyright © 2011-2022 走看看