一、Undo损坏
1、Undo的两种管理方式
Oracle undo管理详解:
http://space.itpub.net/25744374/viewspace-776025/
Oracle undo有两种管理方式:auto和manual。通过参数undo_management来设置。
(1)、MANUAL方式将undo信息记录到SYSTEM表空间下的SYSTEM segment。
SQL> col segment_name format a10
SQL> select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';
SEGMENT_NA TABLESPACE_NAME BYTES NEXT_EXTENT
---------- ------------------------------ ----------------
SYSTEM SYSTEM 393216 1048576
通过上面的查询,可以看出这个system segment在system表空间,默认情况下,只有一个segment,而且比较小,所以如果使用system segment来存储undo信息,会影响数据库的性能。所以Oracle推荐使用undo tablespace方式。
(2)、AUTO方式使用undo tablespace存储undo信息。
使用Undo tablespace存储,会有多个undo segment,并且由于是在undo表空间,而不是system表空间,所以对数据库性能会有所提高。
SQL> select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='TYPE2 UNDO';
SEGMENT_NA TABLESPACE_NAME BYTES NEXT_EXTENT
---------- ------------------------------ ---------- -----
_SYSSMU1$ UNDOTBS1 2228224 65536
_SYSSMU2$ UNDOTBS1 1179648 65536
_SYSSMU3$ UNDOTBS1 1179648 65536
_SYSSMU4$ UNDOTBS1 1179648 65536
_SYSSMU5$ UNDOTBS1 1179648 65536
_SYSSMU6$ UNDOTBS1 1179648 65536
_SYSSMU7$ UNDOTBS1 1179648 65536
_SYSSMU8$ UNDOTBS1 2228224 65536
_SYSSMU9$ UNDOTBS1 2228224 65536
_SYSSMU10$ UNDOTBS1 3276800 65536
已选择10行。
通过上面的查询,可以看出,有10个undo segment来存储undo信息。
也可以通过v$rollname和v$rollstat视图来查看这些信息:
l v$rollname:List the names of all online rollback segments.
l v$rollstat:Contains rollback segment statistics.
2、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=’E:\initsorcl.ora’;
(3)、删除原来的表空间,创建新的undo表空间
SQL> drop tablespace undotbs1;
SQL> create undo tablespace undotbs1 datafile ‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\undotbs1.dbf’ size 10M;
(4)、关闭数据库,修改pfile参数,然后用新的pfile创建spfile,再正常启动数据库:
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
=================================================
方法二:跳过损坏的 segment
因为undo segment有多个,可以通过查看alert log来判断是哪些段损毁了,只需要把这些损坏的segment跳过,先正常启动DB,再创建新的undo表空间,再切换一下。
步骤:
(1)、用spfile创建pfile,然后添加参数:
*._corrupted_rollback_segments=’ _SYSSMU11$’,’ _SYSSMU11$’,’ _SYSSMU11$’
这些字段的值可以通过alert log查看。
(2)、用修改之后的pfile启动DB:
SQL> startup mount pfile=’E:\initsorcl.ora’;
因为跳过了那些损坏的segment,所以DB可以正常启动。
(3)、创建新的undo表空间,并切换过来
SQL> create undo tablespace undotbs2 datafile ‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\UNDOTBS2.DBF’ size 10M;
SQL> alter system set undo_tablespace=undotbs2;
SQL> drop tablespace undotbs1;
(4)、修改pfile,创建spfile,并正常启动
删除:
*._corrupted_rollback_segments=’ _SYSSMU11$’,’ _SYSSMU11$’,’ _SYSSMU11$’
=================================================
二、Current Online Redo损坏
1、如果有归档和备份,可以用不完全恢复
SQL> startup mount;
SQL> recover database until cancle;
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;
这种情况下,可能会报ORA-600[2662](SCN有关)和 ORA-600[4000](回滚段有关)的错误。
使用_allow_resetlogs_corruption参数,强制的打开数据库,可能会导致逻辑的坏块,从而影响数据字典。 所以,即使使用该参数正常打开后,也需要做的一个操作:逻辑导出数据。 重建实例,导入实例。 消除逻辑坏块的可能性。
如果使用_allow_resetlogs_corruption参数启动报了undo segment的错误而无法启动,处理方法参考第一节中undo 的处理情况。 只要DB 能正常open,就导出数据,重建实例,在导入。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25744374/viewspace-776419/ ,如需转载,请注明出处,否则将追究法律责任。