UNDO表空间的ORA-1122错误解决(三)
上一篇 / 下一篇 2008-03-01 23:47:16 / 个人分类:ORACLE
前一段时间解决了一个ORA-1122错误,正好本机的数据库环境由于Windows的自动重起,导致数据库无法打开,出现错误信息也是ORA-1122。
这次出现错误的表空间是UNDO表空间。
上一篇介绍了利用北京进行恢复的方法,这篇尝试重建UNDO表空间的方法。
UNDO表空间的ORA-1122错误解决(一):http://yangtingkun.itpub.net/post/468/455691
UNDO表空间的ORA-1122错误解决(二):http://yangtingkun.itpub.net/post/468/455743
上一篇文章中尝试使用隐含参数_offline_rollback_segments来打开数据库,这里还可以选择将UNDO表空间的数据文件直接删除,然后使用_corrupted_rollback_segments参数来打开数据库,整个过程于上一篇介绍的方法类似。
SQL> STARTUP MOUNT
*kys)r'c1u0ORACLE例程已经启动。
Total System Global Area 76619308 bytes
XU0NpFL!w0Fixed Size 454188 bytes
d9Z%oy(d-|n+m&o0Variable Size 50331648 bytesITPUB个人空间 ~|XvD2~&NCN
Database Buffers 25165824 bytesITPUB个人空间$T!@{.@;bq,P
Redo Buffers 667648 bytes
5[`OfX8['J_0数据库装载完毕。
6kJ(P;I(F N+B0SQL> ALTER DATABASE OPEN;ITPUB个人空间K#u:W[!n^`
ALTER DATABASE OPENITPUB个人空间J`&H#wJ^Nx%D
*ITPUB个人空间#jVc7{$q e)Zz&p
ERROR位于第1行:
JxPI5x"r};p7D0ORA-01122:数据库文件2验证失败
6X
P$u&@ z8p#L1j%m/Qm.h0ORA-01110:数据文件2: 'F:\ORACLE\ORADATA\TEST\UNDOTBS01.DBF'ITPUB个人空间|k{{;WkzL@rrX
ORA-01200: 25600的实际文件大小小于26880块的正确大小
下面尝试使用_corrupted_rollback_segments打开数据库,使用_offline_rollback_segments参数时,Oracle还会尝试进行数据块的延迟清除,而对于_corrupted_rollback_segments来说,Oracle假设事务已经回滚,而不会进行其他的检查。一般UNDO表空间丢失或损害的时候可以尝试使用这个隐含参数:
SQL> ALTER DATABASE DATAFILE 'F:\ORACLE\ORADATA\TEST\UNDOTBS01.DBF' OFFLINE DROP;
数据库已更改。
下面创建初始化参数PFILE:
SQL> SHUTDOWN IMMEDIATE
h?P B)ec:Nh|f0ORA-01109:数据库未打开
ITPUB个人空间Tb.vaT2V2H?
已经卸载数据库。ITPUB个人空间
l Q+R/Bg^2Z
u
ORACLE例程已经关闭。ITPUB个人空间E H6c ?3t
SQL> CREATE PFILE='F:\INITTEST.ORA' FROM SPFILE;
文件已创建。
手工添加下面的初始化参数:
*.undo_management='MANUAL'ITPUB个人空间:p&Z"]?/j&Ji
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
可以通过上一篇文章中给出的方法打开数据库查询DBA_ROLLBACK_SEGS视图来获取回滚段列表。
对于没有启动的数据库,可以通过linux操作系统命令strings从system表空间的数据文件中获取回滚段信息。
对于windows环境下的Oracle,可以将数据文件通过ftp,拷贝到linux系统中,然后执行strings命令:
strings system01.dbf | grep _SYSSMU
下面利用修改后的PFILE打开数据库:
SQL> STARTUP PFILE=F:\INITTEST.ORAITPUB个人空间8v9H|&sk1XS
ORACLE例程已经启动。
Total System Global Area 76619308 bytesITPUB个人空间6OB_*\#xg
Cr
Fixed Size 454188 bytes
:p'A)zR+c*TR+r0Variable Size 50331648 bytesITPUB个人空间b%Yj@oj5hqi
Database Buffers 25165824 bytesITPUB个人空间)Vc'Squ&zX
Redo Buffers 667648 bytes
P:ZQJf[E;N0数据库装载完毕。
;T ?,eA3P+B'B0O0数据库已经打开。
下面的处理方法就和上一篇文章中介绍的比较类似了,先删除回滚段,然后删除回滚表空间,然后建立新的UNDO表空间:
SQL> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUSITPUB个人空间$s
~T)Qz-\%z(j
2 FROM DBA_ROLLBACK_SEGS;
SEGMENT_NAME OWNER TABLESPACE_NAME STATUSITPUB个人空间mx*D$[B_r)m
--------------- ------ -------------------- ----------------ITPUB个人空间CAl]
i!ej
SYSTEM SYS SYSTEM ONLINEITPUB个人空间.O K
z YR M/o|3q%g
_SYSSMU1$ PUBLIC UNDOTBS1 NEEDS RECOVERY
e9\!P[ I&f6a0_SYSSMU2$ PUBLIC UNDOTBS1 NEEDS RECOVERY
Oj(`E
m'dzKx0_SYSSMU3$ PUBLIC UNDOTBS1 NEEDS RECOVERY
c5S&h8H6`rdNp0_SYSSMU4$ PUBLIC UNDOTBS1 NEEDS RECOVERYITPUB个人空间6V'|7d:o'U?6^l
_SYSSMU5$ PUBLIC UNDOTBS1 NEEDS RECOVERYITPUB个人空间)r:pI5sM7e
_SYSSMU6$ PUBLIC UNDOTBS1 NEEDS RECOVERYITPUB个人空间tNe1f6Ql:@Y
_SYSSMU7$ PUBLIC UNDOTBS1 NEEDS RECOVERYITPUB个人空间bL|*A#p7~
J
_SYSSMU8$ PUBLIC UNDOTBS1 NEEDS RECOVERYITPUB个人空间|I6Hy8d
c,g+P
_SYSSMU9$ PUBLIC UNDOTBS1 NEEDS RECOVERY
b4?A-TT3|${H0_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$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU5$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU6$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU7$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU8$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU9$";
回退段已删除。
SQL> DROP ROLLBACK SEGMENT "_SYSSMU10$";
回退段已删除。
SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;
表空间已丢弃。
SQL> CREATE UNDO TABLESPACE UNDOTBS1 DATAFILE 'F:\ORACLE\ORADATA\TEST\UNDOTBS1.DBF' SIZE
表空间已创建。
SQL> SELECT COUNT(*) FROM YANGTK.T;
COUNT(*)
0H$q)HM*q
x6m0----------
S4B"p-e]0 1273614
SQL> SHUTDOWN IMMEDIATE
i(u
z/F1^V,{0数据库已经关闭。ITPUB个人空间/nu RP)iL
已经卸载数据库。
sb2A-HR_%E0ORACLE例程已经关闭。ITPUB个人空间v4LcC1r Kh3z
SQL> STARTUP
3T\0knjWo0h0ORACLE例程已经启动。
Total System Global Area 76619308 bytes
V[:k
m8X0Fixed Size 454188 bytesITPUB个人空间SEVE'V!_
Variable Size 50331648 bytes
)I*J4km or%wV%Mf0Database Buffers 25165824 bytesITPUB个人空间8fv)G$t&V!Y(I]e
Redo Buffers 667648 bytes
;g??
B Y-X,xln0数据库装载完毕。
l2wD"Q_0数据库已经打开。
和上一篇文章中的方法一样,Oracle将需要回滚的数据当作已经提交的数据,为了避免随后出现不可预测的问题,在重起数据库去掉隐藏参数后,应该导出数据,并建立新库,将源数据导入。
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
