Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2836240
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2009-12-31 16:44:28

前一段时间解决了一个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
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:\ORACLE\ORADATA\TEST\UNDOTBS01.DBF'
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
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$)
可以通过上一篇文章中给出的方法打开数据库查询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$";
回退段已删除。
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' SIZE200M;
表空间已创建。
SQL> SELECT COUNT(*) FROM YANGTK.T;
  COUNT(*)
----------
   1273614
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> STARTUP
ORACLE例程已经启动。
Total System Global Area   76619308 bytes
Fixed Size                   454188 bytes
Variable Size              50331648 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
和上一篇文章中的方法一样,Oracle将需要回滚的数据当作已经提交的数据,为了避免随后出现不可预测的问题,在重起数据库去掉隐藏参数后,应该导出数据,并建立新库,将源数据导入。

 

阅读(1151) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~