UNDO 表空间损坏的恢复方法
一般Undo 表空间损坏的情况下,数据库都已不能正常打开了。启动时都会报类似如下的错误:
ORA-01157: cannot identify/lock data file 12 - see DBWR trace file
ORA-01110: data file 12: '/d01/oramtest/proddata/undo01.dbf'
要想解决问题,必须重建UNDO 表空间,但是如果不open, 就不能重建创建undo 表空间。 所以可以先用系统默认的undo 表空间:system rollback segment 来启动数据库,再创建UNDO 表空间。
1.1 创建pfile 文件
SQL> create pfile='F:/initorcl.ora' from spfile;
文件已创建。
1.2 修改pfile文件
#*.undo_tablespace='UNDOTBS1'
#*.undo_management='AUTO'
undo_management='MANUAL'
rollback_segments='SYSTEM'
1.3 启动数据库至Mount 状态
SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;
1.4 offline drop undo 表空间
SQL> ALTER DATABASE DATAFILE 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' OFFLINE DROP;
1.5 open 数据库
SQL> ALTER DATABASE OPEN;
1.6 删除旧的undo 表空间
SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS;
注:该命令不会删除物理文件。 要想一起删除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ;
如: drop tablespace UNDOTBS1 including contents AND DATAFILES CASCADE CONSTRAINTS ;
1.7 创建新的UNDO 表空间
SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M ;
create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M
*
第 1 行出现错误:
ORA-01119: 创建数据库文件 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF'时出错
ORA-27038: 所创建的文件已存在
OSD-04010: 指定了 <create> 选项, 但文件已经存在
因为我们之前删除时并没有删除物理文件,所以在建同名文件时就会报错。 我们可以加上REUSE 参数。 只要文件不在使用,就可以重写已经存在的文件。
SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M reuse;
表空间已创建。
1.8 shutdown 数据库 并将pfile 改回
SQL> select name,issys_modifiable from v$parameter where name='undo_management' or name='rollback_segments';
NAME ISSYS_MOD
-------------------- ---------
rollback_segments FALSE
undo_management FALSE
从上面查询的结果,可以知道修改这2个参数必须重启数据,所以还是shutdown 吧。
SQL> shutdown immediate
1.9 修改pfile 参数
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
1.10 用刚才修改的pfile 启动数据库,并创建spfile
SQL> startup pfile='F:/initorcl.ora' ;
SQL> create spfile from pfile='F:/initorcl.ora';
1.10 再次shutdown,用spfile 启动.
SQL> shutdown immediate
SQL> startup
网友评论