控制文件损坏
使用备库控制文件恢复
数据文件损坏
坏块
使用备库数据文件做bmr,语法:
blockrecover datafile xx block xxx
文件损坏
1~3使用备库数据文件恢复
1. 系统表空间
2. Undo表空间
3. 普通表空间
4. 临时表空间
临时数据文件的损坏或丢失会造成需要使用临时表空间的命令执行失败,但不会造成实例崩溃。一旦损坏采用的恢复方法是重建。
如果在数据库运行过程中,发现临时数据文件损坏或丢失,可以采用替换的方法恢复,不需要重启数据库:
* 向临时表空间中添加新的临时数据文件
SQL> alter tablespace temp add tempfile size 31G;
* 删除掉损坏的临时文件
SQL> alter tablespace temp drop tempfile ‘xxx’;
redo损坏
Current
如果损坏的是current redo log
有两种情况:
情况A、 数据库是正常关闭的。当前日志组的损坏就可以直接用
alter database clear unarchived logfile group n
来重建。
启动数据库到mount状态
SQL> startup mount
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
1 0 YES UNUSED 3 3 NO CURRENT 2 2 YES INACTIVE
SQL> alter database clear unarchived logfile group 3;
Database altered.
SQL> alter database open;
Database altered.
情况B、 如果数据库是非正常关闭(shutdown abort或者crash)- 不完全恢复
- 异常恢复步骤
- 创建pfile
- 在pfile中加入参数:_allow_resetlogs_corruption=TRUE,使用pfile启动数据库
- 启动以后会报Undo相关的Ora600错误:
ORA-00600: internal error code, arguments: [kturbleurec1], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [4137], [27.24.7600081], [0], [0], [], [], [], [], [], [], [], []
在pfile中加入event = ‘10513 trace name context forever, level 2’启动到restrict状态 :
startup restrict pfile='/oracle/product/12c/db_1/dbs/initorcl.ora'
查询非offline状态的回滚段:
select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE';
在pfile中加入参数:_corrupted_rollback_segments=(_SYSSMU6_3167659685$,xxx)
此时可以正常启动数据库。 - 重建undo表空间
非current
Redo log 文件损坏或丢失,在启动数据库时在alert日志中会有如下错误:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
解决:
情景一:
log group 1’/u01/app/oracle/oradata/orcl/redo01.log’丢失,首先确定该日志组状态:
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
1 1 YES INACTIVE
3 3 NO CURRENT
2 2 YES INACTIVE
log group 1为非当前联机日志,可以采用如下方法解决:
SQL> alter database clear logfile group 1;
SQL> alter database open;
情景二:
如果该日志组还没有归档,可以使用下面命令强行clear,强行clear后最好作一次数据库的全备份
sys@BEE> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
1 10 NO CURRENT
2 8 NO INACTIVE
3 9 NO INACTIVE
SQL>alter database clear unarchived logfile group 1;