紧接上篇的话题:
http://www.ixdba.net/article/cb/1355.html
http://www.ixdba.net/article/20/1356.html
上一篇文章中尝试使用隐含参数_offline_rollback_segments来打开数据库,这里还可以选择将UNDO表空间的数据文件直接删除,然后使用_corrupted_rollback_segments参数来打开数据库,整个过程于上一篇介绍的方法类似。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes数据库装载完毕。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01122: 数据库文件 2 验证失败
ORA-01110: 数据文件 2: 'F:ORACLEORADATATESTUNDOTBS01.DBF'
ORA-01200: 25600的实际文件大小小于26880块的正确大小
下面尝试使用_corrupted_rollback_segments打开数据库,使用_offline_rollback_segments参数时,Oracle还会尝试进行数据块的延迟清除,而对于_corrupted_rollback_segments来说,Oracle假设事务已经回滚,而不会进行其他的检查。一般UNDO表空间丢失或损害的时候可以尝试使用这个隐含参数:
SQL> ALTER DATABASE DATAFILE 'F:ORACLEORADATATESTUNDOTBS01.DBF' OFFLINE DROP;
数据库已更改。
下面创建初始化参数PFILE:
SQL> SHUTDOWN IMMEDIATE
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> CREATE PFILE='F:INITTEST.ORA' FROM SPFILE;
文件已创建。
手工添加下面的初始化参数:
*.undo_management='MANUAL'
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
IXDBA.NET社区论坛
可以通过上一篇文章中给出的方法打开数据库查询DBA_ROLLBACK_SEGS视图来获取回滚段列表。
对于没有启动的数据库,可以通过linux操作系统命令strings从system表空间的数据文件中获取回滚段信息。
对于windows环境下的Oracle,可以将数据文件通过ftp,拷贝到linux系统中,然后执行strings命令:
strings system01.dbf | grep _SYSSMU
下面利用修改后的PFILE打开数据库:
SQL> STARTUP PFILE=F:INITTEST.ORA
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes数据库装载完毕。数据库已经打开。
下面的处理方法就和上一篇文章中介绍的比较类似了,先删除回滚段,然后删除回滚表空间,然后建立新的UNDO表空间:
SQL> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS
2 FROM DBA_ROLLBACK_SEGS;
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
--------------- ------ -------------------- ----------------
SYSTEM SYS SYSTEM ONLINE
_SYSSMU1$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU2$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU3$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU4$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU5$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU6$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU7$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU8$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU9$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU10$ PUBLIC UNDOTBS1 NEEDS RECOVERY
已选择11行。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU1$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU2$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU3$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU4$";