UNDO 表空间数据块损坏 ORA-01578 & ORA-01110
前两天搭了某测试数据库,最近被告之删除数据时报错。
alert .log
--------------------------------------
Thu Apr 14 01:58:49 2011
Errors in file D:/oracle/admin/MRC/bdump/mrcSMON.TRC:
ORA-01595: error freeing extent (2) of rollback segment (1))
ORA-01578: ORACLE data block corrupted (file # 2, block # 3)
ORA-01110: data file 2: 'E:/ORADATA/UNDOTBS01.DBF'
--------------------------------------
是程序员执行delete 语句时报错,工具toad 。
Oracle version :9205
delete from mrc_ext_detail_really
报:
-------------------------------------
ORA-01578: ORACLE 数据块损坏(文件号2,块号3)
ORA-01110: 数据文件 2: 'E:/ORADATA/UNDOTBS01.DBF'
我查了这张表一下。大概300W数据,并且该表建了很恶心的索引。3个索引。
好吧。首先直接删这表会怎样呢?可想而知..慢的要死,要么机器死,要么人阵亡。
如果要直接删除所有数据,那么truncate 好了。
回到主题:
由于测试DB的这张表是需要删除所有数据的。因此不用导出导入table中的数据。
因此.....
SQL> conn sys/sys8 as sysdba 已連線. SQL> show parameter undo_tablespace; //查看当前UNDO表空间 NAME TYPE ------------------------------------ --------------------- VALUE ------------------------------ undo_tablespace string UNDOTBS SQL> select file_name from dba_data_files 2 where tablespace_name = 'UNDOTBS'; FILE_NAME --------------------------------------------------- E:/ORADATA/UNDOTBS01.DBF //因为就是该UNDO表空间出的问题。 SQL> select * from v$transaction;//查看是否有未提交的事务。 沒有任何資料列被選取 //创建新的UNDO表空间 SQL> create undo tablespace UNDOTBS2 2 datafile 'E:/ORADATA/UNDOTBS02.DBF' 3 size 600M autoextend on maxsize 1024M; SQL> alter system set undo_tablespace=UNDOTBS2 scope=both; 已更改系統. SQL> show parameter spfile; NAME TYPE ------------------------------------ ---------------------- VALUE ------------------------------ spfile string %ORACLE_HOME%/DATABASE/SPFILE% ORACLE_SID%.ORA SQL> create pfile from spfile; 已建立檔案. //查看initmrc.ora中的*.undo_tablespace='UNDOTBS2' 切换成功!! SQL> show parameter undo_tablespace; NAME TYPE ------------------------------------ ---------------------- VALUE ------------------------------ undo_tablespace string UNDOTBS2 SQL> drop tablespace UNDOTBS including contents and datafiles; 已廢棄表格空間.
如果正式数据库上可要小心操作哦。也可以用一临时UNDO表空间来做切换,以达到删除重建原来的UNDO表空间的目的。