技术开发 频道

Oracle回滚段表空间文件丢损的处理

    方法 II.B: 重建回滚表空间

    这种方法不必考虑数据库是否是归档模式的。

    步骤如下:

    1 、试图脱机所有的丢失或损坏数据文件所在回滚表空间中所包含的回滚段。 ALTER ROLLBACK SEGMENT OFFLINE;

    重复执行这个命令直到所包含的回滚段都脱机 .

    2 、检查回滚段的状态。

    在 drop 掉它们之前它们必需是 offline 状态的。

SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME = <TABLESPACE_NAME>;

    3 、删除掉所有脱机的 c 。 DROP ROLLBACK SEGMENT ;

    4 、处理那些保持 online 状态的回滚段

    重复执行 2 一下的命令,如果回滚段在执行 1 中命令仍保扭亏为盈 "ONLINE" 状态,意味着它之中有活动的事务,你可以用如下的查询来确认一下:

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

    如果这个查询没有结果返回,意味着没有事务在这些回滚段中了。哪果有结果返回,那些不能offline 的回滚段的状态应为 "PENDING OFFLINE" 。可以用 5 中的方法把这些事务杀掉。

    5 、强制使有活动事务的回滚段脱机

    执行如下查询,看这些 "PENDING OFFLINE" 的回滚段包含哪些事务。

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

    用 ALTER SYSTEM KILL SESSION , ; 语句杀掉这些事务,重复执行上面的查询,直到没有事务存在,这时运行一下 2 中的查询,确认这些回滚段己经处于 offline 状态 , 并用 3 中的语句把它们 drop 掉。

    6 、删除这个回滚表空间。 DROP TABLESPACE INCLUDING CONTENTS;

    如果语句执行失败,请与 oracle 技术支持联系,否则转向 7

    7 、重建回滚段表空间。

    8 、重建回滚段,并使它们联机 (online) 。

    译者按:回滚段表空间的数据文件丢失或损坏在实际中是比较棘手和常见的,产生这种问题 的原回很多的,比如介质的损坏、人为的误操作、机器的突然的断电等等。

    建议没实践过这种操作的 oracle 的爱好者可以模拟一下这种故障,实际实测一下,注意一定要在测试库,我模拟的方法如下:

    1 、单独建了一个 rbs 表空间,并在这个表空间建了一个回滚段 rbs_test 。

    2 、指定一个 transaction 用这个回滚段

sql>set transaction use rollback segment rbs_test; sql>insert into test values (2); sql>insert into test values(3);

    3 、另开一个 telnet 窗口 telnet 至主机,执行如下命令 :

sqlplus /nolog sql>conn / as sysdba sql>shutdown abort

    4 、把新加的那个回滚段表空间的数据文件更个名。

0
相关文章