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

Oracle 不完全恢复
不完全恢复

指的恢复到某一个时间点,在这个时间点scn之后的操作会全部消失
recover datafile until scn xxxx;

recover database until scn xxxx;
recover database until sequence xx;--恢复到哪个日志文件截止
recover database until xx;--恢复到哪个时间点

--此时,数据文件头上的scn会小于控制文件的scn号,需要resetlogs才能打开数据库。
alter database open resetlogs;

--当resetlogs打开后,数据库会重置redo日志,redo文件也会重建。控制文件的scn回退到与数据文件一致。

sys@ORCL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
         1          1          0   52428800          1 YES UNUSED                       0
         2          1          0   52428800          1 YES UNUSED                       0
         3          1          1   52428800          1 NO  CURRENT               13808014 17-7月 -13

--resetlog的模式,若为了恢复数据,建议在其他机器上进行恢复,然后同步到生产环境中。


当前状态的在线重做日志文件丢失(不存在备份)

需要不完全恢复,原理就是使用数据库备份恢复,然后利用日志(重做日志和在线重做日志)恢复到最大的scn,即当前状态的在线重做日志的上一个
已备份的日志截止scn。

最后需要recover database until cancel命令打开数据库。 即恢复到输入cancel的那一刻
通过
alter database open resetlog;--打开数据库



--当非当前日志(状态为inactive)丢失,或损坏时,不会影响数据库,因为事务都已经写入数据库

alter database drop logfile group 3;
alter database clear logfile group 3;

alter database add logfile group 2 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG' size 50m;

--简单测试了下,当shutdown abort后,数据库不会做checkpoint,所以日志文件状态仍为active,当active的非当前日志丢失后,
--无法通过restore恢复,恢复后仍会提示logfile不存在,也无法drop掉,提示实例恢复仍需要。

--当resetlog恢复后,resetlog备份集仍可以使用。它会自动跳过resetlog之后的日志文件,及使用resetlog之后重置的日志文件进行恢复。


--当控制文件损坏,恢复的方法有两种
1.利用trace语句备份的控制文件进行恢复
alter database backup controlfile to trace as 'c:\a.txt';--生成控制文件的备份至c盘的a.txt文件
alter database backup controlfile to trace as 'c:\a.txt' resetlogs;--生成resetlog模式的控制信息
alter database backup controlfile to trace as 'c:\a.txt' noresetlogs;--生成noresetlog模式的控制信息

--NORESETLOGS选项生成的控制文件语句仅仅用在 当前版本的在线日志是可用的状态。
--RESTLOGS选项用在在线日志不可用的状态



alter database backup control file to trace;--备份到控制文件到trace文件中。

生成的trace文件信息如下:

STARTUP NOMOUNT  --nomount状态打开数据库,因为控制文件损坏
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16   --最大日志文件数
    MAXLOGMEMBERS 3 --日志文件的镜像最多有三个,此参数在10g不起作用,限制不住
    MAXDATAFILES 100 --控制文件预留的空间大小,要能保留100个数据文件的记录。当增大此数,会自动增加控制文件的大小
    MAXINSTANCES 8 --最大的实例个数,实际上可以超过8个
    MAXLOGHISTORY 292 --日志的历史的条数限制
LOGFILE --日志文件
  GROUP 1 (
    'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG',
    'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\LOG\REDO04.LOG'
  ) SIZE 50M,
  GROUP 2 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG'  SIZE 50M,
  GROUP 3 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'  SIZE 50M

DATAFILE
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF',
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF',
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF',
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF',
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF',
  'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF'
CHARACTER SET ZHS16GBK --字符集
;


select * from $archived_log;--归档日志的信息
select * from v$log_history;--日志i切换就记录,当非归档模式,也可以从此查看

创建日志镜像
alter database add logfile member 'F:\oracle\product\10.2.0\oradata\orcl\LOG\redo04.log' to group 1;

--当增加数据文件,或者增加日志文件时,建议通过trace的方式备份下控制文件。



2.利用rman catalog模式下,恢复控制文件

只能启动到nomount状态,控制文件损坏,Oracle无法判断其target DB,因为一个catalog DB对应多个target DB。
需要通过DBID告诉Oracle需要恢复那个target DB。
rman target sys/system@orcl catalog rman/rman@test
set dbid=xxxxxxxx
list backup of controlfile;
restore controlfile--Oracle通过以下参数寻找恢复控制文件的位置 show parameter control_files
--恢复后,启动到mount状态会发现控制文件的checkpoint_change#比数据文件的checkpoint_change#小。
需要以下命令进行启动
recover database using backup controlfile;--告诉Oracle此控制文件是旧的  

auto--输入auto,Oracle会自动根据备份的archive log进行恢复,但不是真正恢复,应该是Oracle内部在做检查
    --直到恢复到当前联机日志,提示找不到备份文件。这是因为控制文件损坏,Oracle不知道这些信息

再次输入
recover database using backup controlfile;