2007/12/02

Fw about undo and rollback segment corruption

nmgzw

刚才在论坛里看到 lovexueer做了个试验http://www.itpub.net/533872.html,用这个隐含参数不能恢复!试了半天,发现情况一样,于是就查了下,发现他说的这种情况根本就不能用这个参数恢复成功!原文参见1013221.6(metalink)。

这个主要针对8i,对于9i有些涉及到rollback 色光segment的地方注意下,但大体不变!

一、当由于undo的原因数据库down了后,当你试图启动的时候遇到了ora-1157和ora-1110,在这种情况下依赖数据库down的时候,是否在undo里留下了未提交的事务!

1、如果没有遗留的事务在undo内,那么最简单的恢复办法就是offline drop这个文件,然后以restricted模式打开数据库,删除这个undo表空间,下面是步骤:

a、在alert.log中查看数据库是否干净的关闭。

b、注释掉(8i)rollback_segments或则加(9i)_corrupted_rollback_segments = ( ,...., ) 同时把undo_management改为manual

c、startup restrict mount

d、alter database datafile 'file_name' offline drop;

e、recover database until cancel;(这步可能用到redo,多试几次)

f、alter database open resetlogs;

g、导出全库

h、重建数据库

i、导入新库

2、如果数据库并不是干净的关闭,也就是说undo内留有未提交的事务,那么这时候不能够简单的利用offline drop这个回滚文件,你必须从一个备份中恢复这个文件,并进行介质恢复!如果是在非归档模式下,仅当在线日志包含恢复过程中需要的日志信息,以下是步骤:

a、从备份中恢复丢失的文件

b、mount数据库

c、查看文件状态,如果为offline,那么你必须online它

select file#,name,status from v$datfile;

alter database datafile 'full_name' online;

d、查看日志文件信息

select v1.group#,member,sequence#,first_change#

from v$log v1,v$logfile v2

where v1.group#=v2.group#;

e、如果是在非归档模式下

select file#,change# from v$recover_file;

如果change#大于在线日志文件的最小的first_change#,那么这个数据文件将能恢复。如果chage#小于最小的first_chage#,那么不能恢复

f、recover datafile 'full_name'

g、确认所有在线日志文件都被应用

h、打开数据库

二、如果数据库是打开状态

如果在数据库处于运行状态,你发现了丢失会滚数据文件,那么有两种办法:

1、offline drop,并从备份中恢复

a、alter database datafile 'full_name' offline ;

b、恢复丢失的文件

c、select v1.group#,member,sequence# from v$log v1,v$logfile v2where v1.group#=v2.group#;

e、recover datafile 'full_name';

f、alter database datafile 'full_name' online';

2、重新创建会滚表空间

a、alter rollback segment offline;

b、查看所有回滚段是否都已offline

select segment_name,status from dba_rollback_segswhere tablespace_name='';

c、删除offline的回滚段

drop rollback segment ;

e、查看所有剩余仍为online的会滚段

SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = '' AND SEGMENT_ID = USN;

如果没有返回行,说明所有的已经offline;如果返回行,状态显示为pending offline,那么查看active_tx,如果为0,那么没有悬挂的事务,很快就会变为offline,如果大于0,那么看下一步


f、SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"
FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
WHERE R.NAME IN ('', ... , '')
AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;

杀死上面发现的这些会话:
alter system kill session 'sid,serial#';

g、drop tablespace ... including contents;

h、重新创建表空间和回滚段!

No comments: