_SYSSMU156_3796802683$? ? ? ? need recovery
_SYSSMU157_2723916652$? ? ? ? need recovery
_SYSSMU158_1435464080$? ? ? ? need recovery
? 4,试图创建发现报错,真正工作中可以从这里来判断到底是那种情况,第一种情况是可以重新建立的。
?必须先禁止继续使用旧的回滚段和回滚空间:?
SQL>create pfile=/oracle/app/pfile.ora? from spfile
?
file created?
SQL>shutdown? immediate ;
在pfile中添加并修改以下内容:
*.undo_management='manual'? ###手动管理,才可以删除回滚段
*._offline_rollback_segments=('_SYSSMU154_3691636531$','_SYSSMU155_3686385895$','_SYSSMU156_3796802683$','_SYSSMU157_2723916652$','_SYSSMU158_1435464080$')? ? ? ###这样才能删除这些回滚段
*.undo_tablespace='undo2'? ? ###这样就会让以后的事务不在用旧的回滚段和undo表空间,
5.创建成spfile? 然后启动数据库。
SQL>create spfile? from pfile;
?
spfile created?
SQL>startup?
6,删除旧的回滚段和回滚表空间:
SQL>drop rollbackup segment? '_SYSSMU154_3691636531$'? ;
'
'
'
'
把need recovery 的回滚段全部删除后,
SQL>drop undo tablespace undo1 including? contents;? ###因为已经丢失,就不必要添加数据文件了(and datafiles 选项了)
7,创建一个新的undo表空间,然后启动数据库,再修改undo_management 为自动。
注意这样后,所有未提交的事务都当做提交处理了。
总结:要是undo出现问题,你可以先把数据文件offline,然后修改undo_management 为manual,之后查出状态need recover 的回滚段,修改隐含参数 *._offline_rollback_segments ,把需要删除的(状态为need recover 的回滚段)添加进来,然后删除他们。重新创建undo表空间,然后undo_tablespace=新创建的表空间,打开数据库,最后把undo_management =auto ,即可。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------