1、SPFILE丢失
2、controlfile丢失
3、UNDO恢复
4、REDO恢复
5、非系统表空间恢复
6、数据文件恢复
7、非CATALOG恢复
8、基于时间点恢复
9、基于日志序列恢复
10、基于CATALOG数据恢复
11、使用增量备份的恢复操作
1、SPFILE丢失:
startup nomount;
set dbid 3988862108;
restore spfile from autobackup; ---从自动备份中还原
restore spfile from '/....' ---如果找不到AUTO备份的路径,那么可以指定路径
shutdown immediate;
set dbid 3988862108;
startup;
RMAN> RESTORE SPFILE TO '/tmp/spfileTEMP.ora' FROM AUTOBACKUP; 如果数据库在运行,可以恢复到某个目录
模拟操作:
oracle> mv spfileora10g.ora spora10g.ora
oracle>rman target /;
rman> shutdown immediate;
rman> startup nomount;
startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/home/oracle/product/10.20/dbs/initora10g.ora'
rman>set dbid 3988862108;
rman>restore spfile from autobackup;
执行该命令,如果没有找到的话,那可能是文件的路径发生错误.可以通过直接赋予它的文件
rman>restore spfile from '/u01/oracle/flash_recovery_area/ORA10G/autobackup/2008_12_09/o1_mf_s_673025706_4mw7xc79_.bkp
在dbs/目录下产生spfileora10g.ora文件。证明spfile 已经恢复好
rman> shutdown immediate;
rman> startup ;(如果该命令不能够启动数据库,那么需要set dbid 3988862108)
2.controlfile 丢失:
startup nomount;
restore controlfile from autobackup;
alter database mount;
recover database;
alter database open resetlogs;
注意:在做了alter database open resetlogs;会把online redelog file清空,数据文件丢失.所以这个时候要做一个全备份。
模拟操作:
oracle>rm *.ctl
oracle>rman target / ;//不能够连接到rman ,因为controlfile丢失
oracle>sqlplus /nolog;
SQL>shutdown immediate; //因为controlfile丢失,不能够正常shutdown
SQL>shutdown abort;
oracle>rman target /;
rman>startup nomount;
rman>restore controlfile from autobackup;
rman>alter database mount;
rman>alter database open resetlogs;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of alter db command at 12/09/2008 16:21:13
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/home/oracle/oradata/ora10g/system01.dbf
//出错, redo log的scn记录在controlfile里面的,因为我们有新的controlfile,所以需要resetlogs;/*
resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始,每次使用resetlogs命令的时候,SCN不会被重置,不过oracle会重置日志序列号,而且会重置联机重做日志内容.这样做是为了防止不完全恢复后日志序列会发生冲突(因为现有日志和数据文件间有了时间差)。
*/
rman>recover database; 这里有可能出现控制文件过久的问题,那么就需要使用recover database using backup controlfile;
rman>alter database open resetlogs;
Redolog file丢失:(下面的这些语句一定要在sqlplus中执行,不是在rman中执行)
(sqlplus/nolog)
1.shutdown immediate;
2.startup mount;
3.recover database until cancel;(media recovery)
4.alter database resetlogs;
------------------------------------------------------------------------------
using backup controlfile和 until cancel 区别
1. recover database using backup controlfile
2. recover database until cancel
3. recover database using backup controlfile until cancel;
4. recover database until cancel using backup controlfile;
区别:
1. 如果丢失丢失当前控制文件,用冷备份中的控制文件恢复的时候。用来告诉oracle,不要以controlfile中的scn作为恢复的终点;
2. 如果丢失current/active redo的时候。手动指定终点。
3. 如果丢失当前controlfile并且current/active redo都丢失,会先去自动应用归档日志,可以实现最大的恢复;
4. 如果丢失当前controlfile并且current/active redo都丢失,以旧的redo中的scn为恢复终点。因为没有应用归档日志,所有会丢失数据。
以下条件需要使用using backup controlfile
1)、使用备份控制文件(旧控制文件)
2)、重建resetlogs控制文件,如果重建立noresetlogs不必要使用using backup controlfile
重建控制文件的时候:
使用noresetlogs方式创建的控制文件中scn是从redo log中获得;
使用resetlogs方式创建的控制文件中scn是从datafile中获得。
------------------------------------------------------------------------------
3、UNDO 损坏的情况
Undo 的内容大多数是因为异常宕机,在启动的时候报的错误。DB 不能启动。
比如:ORA-00600: internal error code, arguments: [4194],
对于Undo 损坏的情况,能用备份恢复最好,如果不能,就只能通过一些特殊的方法来恢复。
方法一: 使用system segment
(1)用spfile 创建pfile,然后修改参数:
#*.undo_tablespace='UNDOTBS1'
#*.undo_management='AUTO'
#*.undo_tablespace
#*.undo_retention
undo_management='MANUAL'
rollback_segments='SYSTEM'
(2)用修改之后的pfile,重启DB
SQL> STARTUP MOUNT pfile='F:\initorcl.ora' ;
(3)删除原来的表空间,创建新的UNDO 表空间
SQL> drop tablespace undotbs;
SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;
(4)关闭数据库,修改pfile参数,然后用新的pfile创建spfile,在正常启动数
据库。
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
方法二:跳过损坏的segment
在方法一里面,我们使用了system segment。undo segment 有多个,我们可以通过alert log 来查看正在使用的是哪些segment,这些段有可能损坏了。我们只需要把这些损坏的segment 跳过,先正常启动DB,在创建新的UNDO 表空间,在切换一下。
(1)修改pfile,添加参数:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'
这些字段的值,我们通过alert log 查看。也可以通过如下命令查看:
#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u
(2)用修改之后的pfile启动DB
因为跳过了哪些损坏的segment,所以DB 可以正常启动。
3)创建新的UNDO 表空间,并切换过来
SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;
SQL> alter system set undo_tablespace=undotbs1;
SQL> drop tablespace undotbs;
(4)修改pfile,创建spfile,并正常启动
删除:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'
以上就是UNDO 出现故障的2种处理方法。
4、Redo Log File损坏 (非全部丢失)
重做日志文件在数据库中是要求最高的组件,首先其对磁盘的IO要求极高,其次一旦CURRENT组发生故障,数据库会立即崩溃,并且100%会发生数据丢失,所以ORACLE建议至少每个组需要两个成员,并且在数据库运行过程中日志文件会一直被锁定,以防不测。
Redo log的恢复分为两种:CURRENT 和非CURRENT
CURRENT 情况
造成redo 损坏,很多情况是与突然断电有关。这种情况下是比较麻烦的。
(1)如果有归档和备份,可以用不完全恢复。
SQL>startup mount;
SQL>recover database until cancel; 先选择auto,尽量恢复可以利用的归档日志,
然后重新执行:
SQL>recover database until cancel; 这次输入cancel,完成不完全恢复,
用resetlogs打开数据:
SQL>alter database open resetlogs;打开数据库
(2)强制恢复,这种方法可能会导致数据不一致
sql>startup mount;
sql>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
sql>recover database until cancel;
sql>alter database open resetlogs;
这里主要看2点:
(1)使用了_allow_resetlogs_corruption 参数
(2)这种情况下,可能会报ORA-600[2662](SCN有关)和 ORA-600[4000](回滚段有关)的错误。
使用_allow_resetlogs_corruption参数,强制的打开数据库,可能会导致逻辑的坏块,从而影响数据字典。 所以,即使使用该参数正常打开后,也需要做的一个操作:逻辑导出数据。重建实例,导入实例。消除逻辑坏块的可能性。
运气好的话,数据库能正常打开,如果使用_allow_resetlogs_corruption参数启动报了undo segment的错误而无法启动,处理方法参考undo 的处理情况。
但是由于使用_allow_resetlogs_corruption方式打开,会造成数据的丢失,且数据库的状态不一致。因此,这种情况下Oracle建议通过EXP方式导出数据库。重建新数据库后,再导入。
metalink上的两篇文章介绍了两种情况的处理方法:
TECH: Summary For Forcing The Database Open With `_ALLOW_RESETLOGS_CORRUPTION` with Automatic Undo Management[ID 283945.1]
http://blog.csdn.net/tianlesoftware/archive/2010/12/29/6106083.aspx
ORA-600 [2662] Block SCN is ahead of Current SCN [ID 28929.1]
http://blog.csdn.net/tianlesoftware/archive/2010/12/29/6106130.aspx
非CURRENT 情况
这种情况下的恢复比较简单,因为redo log 是已经完成归档或者正在归档。没有正在使用。可以通过v$log 查看redo log 的状态。
(1)如果STATUS是INACTIVE,则表示已经完成了归档,直接清除掉这个redo
log即可。
SQL>startup mount;
SQL> alter database clear logfile group 3 ;
SQL>alter database open;
(2)如果STATUS 是ACTIVE ,表示正在归档,此时需要使用如下语句:
SQL>startup mount;
SQL> alter database clear unarchived logfile group 3 ;
SQL>alter database open;
5、非系统表空间
若出现介质故障导致某表空间不可用,恢复可以在数据库处于 open 或 mount 状态下进行,步骤如下:
1. 将该表空间置于offline状态
2. 修复表空间数据
3. 恢复表空间并处于一致性
4. 将表空间online
rman> sql 'alter tablespace dave offline';
如果文件不存在,就加immediate 参数
rman> sql 'alter tablespace dave offline immediate';
rman>restore tablespace dave;
rman>recovery tablespace dave;
rman>sql 'alter tablespace dave online';
6、数据文件损坏
如果出现介质故障导致某表空间数据文件丢失(这种情况也可以参照表空间损坏的恢复)。
恢复可以在数据库处于 open 或 mount 状态下进行,只需4个步骤
1. 将该数据文件置于 offline 状态
2. 修复数据文件(指定数据文件编号)
3. 恢复数据文件
4. 将数据文件 online
rman> sql 'alter datafile 8 offline ';
rman>restore datafile 8;
rman>recovery datafile 8;
rman>sql 'alter datafile 8 online';
7、非catalog方式完全恢复
数据库出现问题:
1.startup nomount;
2.restore controlfile from autobackup;
3.alter database mount;
4.restore database;
5.recover database;
6.alter database open resetlogs;
模拟操作:
oracle ora10g> rm *;
oracle ora10g> ls;
oracle ora10g> //数据文件,控制文件全部删除
oracle ora10g> rman target /; //因为controlfile 丢失,不能够连接到rman
oracle ora10g> sqlplus /nolog;
oracle ora10g> connect / as sysdba;
oracle ora10g> shutdown abort;
oracle ora10g> rman target /
rman> startup nomount;
rman> restore controlfile from autabackup;
rman> alter database mount;
rman> restore database;
rman> recover database; //online redolog 不存在
SQL>recover database until cancel; //当redo log(全部?)丢失,数据库在缺省的方式下,是不容许进行recover操作的,那么如何在这种情况下操作呢
直接添加隐含参数alter system set "_allow_resetlogs_corruption"='TRUE' scope=spfile;到最后要去掉隐含参数
alter system reset "_allow_resetlogs_corruption scope=spfile sid='*';
或者用下面的办法:
SQL>create pfile from spfile;
vi /u01/product/10.20/dbs/initora10g.ora,在这个文件的最后一行添加
*.allow_resetlogs_corruption='TRUE'; //容许resetlog corruption
SQL>shutdown immediate;
SQL>startup pfile='/u01/product/10.20/dbs/initora10g.ora' mount;
SQL>alter database open resetlogs;
8、基于时间点的恢复:
run{
set until time "to_date(07/01/02 15:00:00','mm/dd/yy hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
1.startup mount;
2.restore database until time "to_date('2009-7-19 13:19:00','YYYY-MM-DD HH24:MI:SS')";
3.recover database until time "to_date('2009-7-19 13:19:00','YYYY-MM-DD HH24:MI:SS')";
4.alter database open resetlogs;
如果有open resetlogs,都是不完整恢复.
基于 SCN的恢复:
1.startup mount;
2.restore database until scn 10000;
3.recover database until scn 10000;
4.alter database open resetlogs;
9、基于日志序列的恢复:
1.startup mount;
2.restore database until SEQUENCE 100 thread 1; //100是日志序列
3.recover database until SEQUENCE 100 thread 1;
4.alter database open resetlogs;
日志序列查看命令: SQL>select * from v$log;其中有一个sequence字段.resetlogs就会把sequence 置为1
10、RMAN catalog模式下的备份与恢复=====================
1.创建Catalog所需要的表空间
SQL>create tablespace rman_ts size datafile '/u01/oracle/oradata/ora10g/rmants.dbf' 20M;
2.创建RMAN用户并授权
SQL>create user rman identified by rman default tablespace rman_ts quota unlimited on rman_ts;
SQL>grant recovery_catalog_owner to rman;(grant connect to rman)
查看角色所拥有的权限: select * from dba_sys_privs where grantee='RECOVERY_CATALOG_OWNER';
(RECOVER_CATALOG_OWNER,CONNECT,RESOURCE)
3.创建恢复目录
oracle>rman catalog rman/rman
RMAN>create catalog tablespace rman_ts;
RMAN>register database;(database是target database)
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
RMAN> connect target /;
以后要使用备份和恢复,需要连接到两个数据库中,命令:
oracle>rman target / catalog rman/rman (第一斜杠表示target数据库,catalog表示catalog目录 rman/rman表示catalog用户名和密码)
命令执行后显示:
Recovery Manager: Release 10.2.0.1.0 - Production on Wed Dec 10 15:00:42 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORA10G (DBID=3988862108)
connected to recovery catalog database
命令解释:
Report schema Report shema是指在数据库中需找schema
List backup 从control读取信息
Crosscheck backup 看一下backup的文件,检查controlfile中的目录或文件是否真正在磁盘上
Delete backupset 24 24代表backupset 的编号, 既delete目录,也delete你的文件
注意:在做了alter database open resetlogs;会把online redelog file清空,数据文件丢失.所以这个时候要做一个全备份。
resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始,每次使用resetlogs命令的时候,SCN不会被重置,不过oracle会重置日志序列号,而且会重置
联机重做日志内容.这样做是为了防止不完全恢复后日志序列会发生冲突(因为现有日志和数据文件间有了时间差)。
Rman 归档文件丢失导致不能备份的,在备份前先执行以下两条命令
crosscheck archivelog all;
delete expired archivelog all;
11、使用增量备份的恢复操作
Oracle 会在还原数据文件时自动判断是否使用了增量备份策略,还会根据需要自动应用所需的增量备份集。在这种情况下,不需要执行不同的恢复操作。
使用增量备份的还原操作期间,restore 命令只还原基本备份。一旦完成了这个还原操作,就可以执行recover 命令将增量备份和归档的重做日志应用于数据库。一旦完成了恢复操作,我们就能正常打开数据库。在所有情况下,Oracle 都会尝试还原基本备份和最新的增量备份。这样减少完全恢复数据库所应用的重做日志,从而减少还原时间。
需要注意的是,由于在恢复进程期间,数据库很可能有多个备份集,所以恢复操作的时间会超出我们的预期。不过,根据多种因素,数据更改速率是一个重要因素,应用增量备份集比应用大量重做日志更快,这种增量备份解决方案就是一个快速的解决方案。因此,增量备份地优势在于它是一个快速备份的策略并且需要更小的空间来保存备份集片。不过它的代价就是恢复时间有可能会更长。