刚才在论坛里看到 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 = (
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
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 = '
如果没有返回行,说明所有的已经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:
Post a Comment