Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131336
  • 博文数量: 19
  • 博客积分: 56
  • 博客等级: 民兵
  • 技术积分: 166
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-28 16:31
个人简介

不知道干嘛。不知道说啥。什么都没有!

文章分类

全部博文(19)

文章存档

2015年(1)

2014年(6)

2013年(12)

我的朋友

分类: Oracle

2014-02-13 22:48:04

原文地址:ORACLE 常见恢复情况 作者:guardiangel

RMAN:
nocatalog方式:用control file作为catalog,每一次备份都要往控制文件里面写好多备份信息,控制文件里面会有越来越多的备份信息,即RMAN的备份信息写在本地控制文件里面。 


catalog方式:必须要首先要创建目录备份数据库(catalog,也称知识库),建立恢复目录,即数据库的备份信息写到恢复目录里面。 


当通过rman nocatalog方式备份Oracle数据库,Oracle使用controlfile存放RMAN的备份信息。因此,当使用Rman nocatalog方式备份数据库时,一定要记得备份controlfile。 


初始化参数control_file__record_keep_time设置备份信息保存时间,到规定时间就自动清除以前的备份信息: 


一、SPFILE丢失
1.startup nomount
2.set dbid XXX
3.restore spfile from autobackup;--或者 restore spfile from 'path/file_name';
4.shutdown immediate;
5.set dbid XXX
6.startup


二、控制文件丢失,从RMAN恢复
1.set dbid XXX
2. startup nomount;
3.restore controlfile from autobackup;--restore controlfile from 'file_name';
4.alter database mount;
5.recover database;--(因为控制文件中的SCN会发生变化,所以此处用来保证数据一致性)
6.alter database open resetlogs;
resetlogs 表示数据库新的逻辑周期开始,使用resetlogs,不会重置SCN,但是会重置日志序列号,重置联机重做日志内容。这样是为了防止不完全
恢复后日志序列发生冲突,因为现在日志和数据文件之间有了时间差。


三、UNDO损坏
UNDO损坏往往因为系统宕机。Database不能正常启动。如ORA-00600的情况,使用备份最好,如果不能,使用其它方法恢复。
A)使用system segment
3.1、创建PFILE
startup nomount;
Create pfile='pfileSID.ora' from spfile;
3.2 修改pfile中的内容
#*.undo_tablespace='UNDOTBS1'
#*.undo_management='AUTO'
undo_management='MANUAL'
rollback_segments='SYSTEM'
3.3使用PFILE启动
startup mount pfile='pfileSID.ora';
3.4 删除原来的表空间
drop tablespace undoXXX;
3.5 新建表空间
create undo tablespace undotb1 datafile '/u01/app/oracle/oradata/orcl/undotb1' size 100m;
3.6关闭数据库,修改PFILE参数,用新的pfile创建spfile,再启动数据库
*.undo_tablespace='UNDOTB1'
*.undo_management='AUTO'
startup nomout;
create spfile from pfile='pfileSID.ora';
shutdown immediate;
startup ;


B).跳过损坏segment
2.1.查看alert log或者通过命令。
[oracle@pc-centos ~]$ strings /u01/app/oracle/oradata/orcl/system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u
              and substr(drs.segment_name,1,7) != '_SYSSMU' 
D'              and substr(drs.segment_name,1,7) != ''_SYSSMU'' ' );
_SYSSMU10_3459578018
_SYSSMU10_4131489474
2.2修改pfile,其中字段的值就是上面的命令查询出来的。
*._corrupted_rollback_segments='_SYSSMU10_3459578018','_SYSSMU10_4131489474'
2.3使用修改的PFILE启动database
startup pfile='pfileSID.ora';
2.4创建新的表空间,切换,删除原来的表空间
create undo tablespace undotb2 datafile '/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 100m;
alter system set undo_tablespace=undotb2;
drop tablespace undotb2;
2.5 修改pfile创建spfile 启动。
删除pfile中的*._corrupted_rollback_segments='_SYSSMU10_3459578018','_SYSSMU10_4131489474'
startup nomount pfile='pfileSID.ora';
create spfile from pfile='pfileSID.ora';
startup ;


四、Redo log file损坏
重做日志文件与恢复紧密相关,如果CURRENT组发生故障,则数据库会立即崩溃,并发生数据丢失。ORALCE建议建立两个日志组,每组两个成员,并保持锁定。
Redo log file恢复分为两种:CURRENT 和 非CURRENT
4.1 CURRENT损坏
1)对于有归档和备份,可以选择不完全恢复
startup mount;
recover database until auto;--尽可能恢复可利用的归档日志
recover database until cancel;
alter database open resetlogs;


2)强制恢复,不建议使用。
startup mount;
alter system set "_allow_resetlogs_corruption"=true scope=spfile;
recover database until cancel;
alter database open resetlogs;
使用强制恢复,可能会报错,因此打开数据库中,也要进行如下操作,逻辑导出数据,重建实例,导入实例。


4.2 非CURRENT组的恢复
此种情况下,redo log已经完成归档或正在归档,没有被使用,通过v$log查看状态。
4.2.1 如果状态是 inactive表示已经完成归档,则直接清除此red log即可。
startup mount;
SQL> select group#,status from v$log;
 
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 CURRENT
 
alter database clear logfile group XXX;--XXX代表group#的值
alter database open;

4.2.2如果状态是ACTIVE,表示正在归档,则使用如下

startup mount;
SQL> select group#,status from v$log;
 
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 CURRENT
 
alter database clear unarchived logfile group XXX;--XXX代表group#的值
alter database open;

五、非系统表空间损坏
如果介质故障导致某表空间不可用,恢复可以在数据库OPEN 或者 MOUNT下进行。
rman> sql 'alter tablespace jerry offline';
如果文件不存在,则使用
rman> sql 'alter tablespace jerry offline immediate';--immediate不触发检查点
rman> restore tablespace jerry;
rman> recovery tablespace jerry;
rman> sql'alter tablespace jerry online';

六、数据文件损坏
如果介质故障导致某表空间的数据文件不可用,恢复可以在数据库OPEN 或者 MOUNT下进行。
rman> sql 'alter datafile 9 offline';
rman> restore datafile 9;
rman> recovery datafile 9;
rman> sql 'alter datafile 9 online';

七,基于时间点/SCN/序列的恢复
7.1 基于时间点的恢复
RMAN> run{
2>              set until time "to_date('02/12/2014 22:16:00','mm/dd/yyyy hh24:mi:ss')";
3>              restore database;
4>              recover database;
5>              alter database open resetlogs;
6>      }


executing command: SET until clause


Starting restore at 2014-02-08 12:44:41
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=22 device type=DISK
flashing back control file to SCN 9837541

或者 
SQL>startup mount;
SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> recover database until time '2014-02-12 22:16:00';
SQL>alter database open resetlogs


7.2 基于SCN
SQL>startup mount;
SQL>restore database until scn 1000
SQL>recover database until scn 1000
SQL>alter database open resetlogs


7.3 基于日志SEQUENCE
SQL>startup mount;
SQL>select sequence from v$log;
SQL>restore database until SEQUENCE 90 thread 1; 
SQL>recover database until SEQUENCE 90 thread 1;
SQL>alter database open resetlogs;
resetlogs 就会把 sequence  置为 1


八、非catalog下的完全恢复
SQL>startup nomount;
SQL>restore controlfile from autobackup;
SQL>alter database mount;
SQL>restore database;
SQL>recover database;
SQL>alter database open resetlogs;
阅读(2058) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~