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测试和开发

  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/phyger/p/14377825.html
Copyright © 2011-2022 走看看