日期:2014-05-16  浏览次数:20437 次

oracle学习文档整理2
结论:
如果数据库是正常shutdown,非当前日志都可以直接clear来重新生成,而且不会丢失数据,因为正常关闭db,数据已经写入dbf文件了。
唯独当前日志不可以,当前日志必须首先从有效的备份中拷贝一个日志文件过来,然后用
alter database clear unarchived logfile group n;

方法二:用cancel模式恢复数据库
recover database until cancel;
alter database open resetlogs; --resetlogs就是根据控制文件让系统自动重新生成redo

结论:
如果数据库是正常关闭的,用recover database until cancel可以轻松恢复或者说重新建立所有的redo,不再区分是否
是当前日志,而且由于正常关闭不会丢失任何数据,唯一可能丢失的情况就是如果日志还没有归档这种恢复方法由于要
resetlogs所以在恢复完成后日志清零,以前的备份不再起作用,所以建议立即备份。

方法三:通过重新生成控制文件来恢复redo
alter database backup controlfile to trace;
创建控制文件
CREATE CONTROLFILE REUSE DATABASE "ORA9"  RESETLOGS  ARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
    MAXLOGFILES 50
    MAXLOGMEMBERS 5
    MAXDATAFILES 100
    MAXINSTANCES 1
    MAXLOGHISTORY 226
LOGFILE
  GROUP 1 '/T3/ORACLE/oradata/ORA9/redo01.log'  SIZE 100M,
  GROUP 2 '/T3/ORACLE/oradata/ORA9/redo02.log'  SIZE 100M,
  GROUP 3 '/T3/ORACLE/oradata/ORA9/redo03.log'  SIZE 100M
-- STANDBY LOGFILE
DATAFILE
  '/T3/ORACLE/oradata/ORA9/system01.dbf',
  '/T3/ORACLE/oradata/ORA9/undotbs01.dbf',
  '/T3/ORACLE/oradata/ORA9/cwmlite01.dbf',
  '/T3/ORACLE/oradata/ORA9/drsys01.dbf',
  '/T3/ORACLE/oradata/ORA9/example01.dbf',
  '/T3/ORACLE/oradata/ORA9/indx01.dbf',
  '/T3/ORACLE/oradata/ORA9/odm01.dbf',
  '/T3/ORACLE/oradata/ORA9/tools01.dbf',
  '/T3/ORACLE/oradata/ORA9/users01.dbf',
  '/T3/ORACLE/oradata/ORA9/xdb01.dbf',
  '/T3/ORACLE/oradata/ORA9/test01.dbf'
CHARACTER SET ZHS16GBK
;
另存为一个脚本运行@clone.sql
打开数据库alter database open resetlogs;

前三种方法都是假设db正常关闭,数据已经写入数据库文件中,所以不会由数据存在redo种,所以clear也不会丢失数据。

方法四:修改系统参数方法
shutdown abort 强行关闭数据库,手动模拟删除redo文件启动数据库后报错,尝试前面三种方法都无法恢复丢失的redo文件
修改init.ora,加入一行
_allow_resetlogs_corruption=true
启动with pfile
打开数据库alter database open resetlogs;