不完全恢复 指的恢复到某一个时间点,在这个时间点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;