ORA-01157/ORA-01110故障处理
http://blog.sina.com.cn/s/blog_5624c51a0100087w.html
http://www.soft6.com/tech/5/56615.html
oracle回退文件UNDOTBS01.DBF损坏的处理
ORA-01110: data file 2: '/home/oracle/oradata/esal/undotbs01.dbf'
SQL> connect sys/oracle as sysdba
Connected.
SQL> startup force
ORACLE instance started.
ORA-01110: data file 2: '/home/oracle/oradata/esal/undotbs01.dbf'
SQL> show parameter rollback
NAME TYPE VALUE
---------------------- ----------- ------------------------------
fast_start_parallel_rollback string LOW
max_rollback_segments integer 37
rollback_segments string
transactions_per_rollback_segment integer 5
4 修改初始化参数
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=MANUAL
undo_retention=10800
undo_tablespace=undotbs01
rollback_segments='SYSTEM'
5 启动数据库
SQL> connect sys/oracle as sysdba
Connected.
SQL> startup force
ORACLE instance started.
...
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: '/home/oracle/oradata/esal/undotbs01.dbf'
6将undotbs01离线;
Database altered.
SQL> alter database open;
Database altered.
7删除undotbs01
Tablespace dropped.
Tablespace created.
9修改参数文件;
File created.
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_retention=10800
undo_tablespace=undotbs01
SQL> connect xxx/xxx@xxx as sysdba
Connected.
SQL> startup force
ORACLE instance started.
Database mounted.
Database opened.
幸运的是,JH局有备份,情况就比较简单了,用第一种方法,10分钟就搞定了,但是时间花在了备份现场在,用了一个小时。
需要注意的是:
1、做以上操作前都要做冷备份,一但有问题至少可以恢复到问题现场点。
2、以上方法仅适用于只有UNDO表空间损坏,其它系统表和日志是好的情况。
3、出问题后先看看日志,并用SQLPLUS进命令行看看情况,不要匆忙关闭数据库重启;
**********************************************************************************************************************
######################################################################################
# [9].回滚段恢复 #
######################################################################################
参见1013221.6
28812.1
################################
# [9.1].正常shutdown,回滚数据文件丢失,
# 有备份,回滚段恢复
################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\oracle\oradata\testdb\archive
最早的概要日志序列 1
下一个存档日志序列 3
当前日志序列 3
SQL> select us#, name, status$ from undo$;
US# NAME STATUS$
---------- ------------------------------ ----------
0 SYSTEM 3
1 _SYSSMU1$ 3
2 _SYSSMU2$ 3
3 _SYSSMU3$ 3
4 _SYSSMU4$ 3
5 _SYSSMU5$ 3
6 _SYSSMU6$ 3
7 _SYSSMU7$ 3
8 _SYSSMU8$ 3
9 _SYSSMU9$ 3
10 _SYSSMU10$ 3
已选择11行。
SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU1$ ONLINE
_SYSSMU2$ ONLINE
_SYSSMU3$ ONLINE
_SYSSMU4$ ONLINE
_SYSSMU5$ ONLINE
_SYSSMU6$ ONLINE
_SYSSMU7$ ONLINE
_SYSSMU8$ ONLINE
_SYSSMU9$ ONLINE
_SYSSMU10$ ONLINE
已选择11行。
RMAN> backup format ''c:\noarch_%s%p1.bak'' database;
启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_211.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05
RMAN>
RMAN>
RMAN> copy current controlfile to ''c:\currcont.ctl'';
启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CURRCONT.CTL
完成 copy 于 03-3月 -05
RMAN> exit
恢复管理器完成。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''ok'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''no'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES ACTIVE
3 4 NO ACTIVE
SQL> shutdown -->>这里是正常shutdown,所以会做检查点,当前的数据文件不需要恢复状态
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
~~~~~~~~~~~~~~~~~~~~~~~~
模拟删除UNDOTBS01.DBF
这时其他文件都是一致性的,
只需要UNDOTBS01.DBF恢复
~~~~~~~~~~~~~~~~~~~~~~~~
删除UNDOTBS01.DBF
还原一个UNDOTBS01.DBF的备份
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF''
SQL> recover database ;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select count(*),status from arch group by status;
COUNT(*) ST
---------- --
6166 no
98656 ok
################################
# [9.2].shutdown abort(或者使用了别的老的数据文件),
# 回滚数据文件丢失,有备份,回滚段恢复 ,
# 数据库没有活动事务
################################
略:
也能完全恢复
~~~~~~~~~~~~~~~~~~~~~~
虽然是abort,但是只是需要做一个检查点,
将数据写到数据文件中,但这部分数据直接
在在线日志中可以拿到了,只需要前滚,
不需要进行回滚
~~~~~~~~~~~~~~~~~~~~~~
################################
# [9.3].shutdown abort(或者使用了别的老的数据文件),
# 回滚数据文件丢失,有备份,回滚段恢复 ,
# 数据库有活动事务
################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\oracle\oradata\testdb\archive
最早的概要日志序列 1
下一个存档日志序列 3
当前日志序列 3
RMAN> backup format ''c:\noarch_%s%p1.bak'' database;
启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_211.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05
RMAN>
RMAN>
RMAN> copy current controlfile to ''c:\currcont.ctl'';
启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CURRCONT.CTL
完成 copy 于 03-3月 -05
RMAN> exit
恢复管理器完成。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''ok'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''no'' from dba_objects; --这里没有commit
已创建6166行。
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES ACTIVE
3 4 NO ACTIVE
SQL> shutdown abort-->>这里是正常shutdown,所以会做检查点,当前的数据文件不需要恢复状态
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
~~~~~~~~~~~~~~~~~~~~~~~~
模拟删除UNDOTBS01.DBF
这时其他文件都是一致性的,
只需要UNDOTBS01.DBF恢复
~~~~~~~~~~~~~~~~~~~~~~~~
删除UNDOTBS01.DBF
还原一个UNDOTBS01.DBF的备份
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF''
SQL> recover database ;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select count(*),status from arch group by status;
COUNT(*) ST
---------- --
98656 ok
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8i如果有活动的事务,那么恢复回滚表空间时,
在前滚后后滚时要读自己回滚段里的数据,
而自己的数据文件已经损坏了,所以就不允许的,
所以在mount前将初始化参数
rollback_segments=(system)
_corrupted_rollback_segments=(rbs0,rbs1,rbs2……)
而9I,测试中回撤表空间数据文件恢复跟常规表空间恢复一样
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################
# [9.4].shutdown abort(或者使用了别的老的数据文件),
# 回滚数据文件丢失,没有备份,回滚段恢复 ,
# 数据库有活动事务
################################
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''ok'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''no'' from dba_objects;
已创建6166行。
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL>
丢失undo文件
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> alter database datafile ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF'' offline;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> select US#,NAME,ts#,STATUS$,FLAGS from undo$ where STATUS$ <> 3;
US# NAME TS# STATUS$ FLAGS
---------- ------------------------------ ---------- ---------- ----------
1 _SYSSMU1$ 1 2
2 _SYSSMU2$ 1 2
3 _SYSSMU3$ 1 2
4 _SYSSMU4$ 1 2
5 _SYSSMU5$ 1 2
6 _SYSSMU6$ 1 2
7 _SYSSMU7$ 1 2
8 _SYSSMU8$ 1 2
9 _SYSSMU9$ 1 2
10 _SYSSMU10$ 1 2
11 _SYSSMU11$ 1 5
SQL> select count(*) from arch; --这里表是不能读取一致性了
select count(*) from arch
*
ERROR 位于第 1 行:
ORA-00376: ???????? 2
ORA-01110: ???? 2: ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF''
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
编辑INITtestdb_undo.ORA''
*.undo_management=''AUTO''
*.undo_retention=10800
*.undo_tablespace=''UNDOTBS1''
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
_offline_rollback_segments=true
SQL> startup pfile=''C:\oracle\ora92\database\INITtestdb_undo.ORA'';
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> alter database open;
数据库已更改。
SQL> select count(*) from arch;
COUNT(*)
----------
104822
再创建新的undo表空间
drop 坏的undo tablespace
最好做一个整库的导出,并导入到新系统
################################
# [9.5].shutdown abort(或者使用了别的老的数据文件),
# 回滚数据文件丢失,没有备份,但控制文件有创建
# 该回撤段数据文件的所有历史日志,回滚段恢复 ,
# 数据库有活动事务
################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
SQL> alter tablespace UNDOTBS1 add datafile ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS02
DBF'' size 1m;
表空间已更改。
SQL>
SQL>
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''ok'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''no'' from dba_objects;
已创建6166行。
SQL> SHUTDOWN ABORT
ORACLE 例程已经关闭。
删除UNDOTBS02
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF''
SQL> ALTER DATABASE CREATE DATAFILE ''C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF'';
数据库已更改。
SQL> RECOVER DATABASE;
完成介质恢复。
SQL> ALTER DATABASE OPEN;
数据库已更改。
SQL> COL NAME FORMAT A50;
SQL> SELECT NAME,STATUS FROM V$DATAFILE;
NAME STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF ONLINE
C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF ONLINE
已选择6行。
################################
# [9.6].数据库打开时回撤表空间文件
# 损坏,没有备份
################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''ok'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select ''no'' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES INACTIVE
3 4 YES ACTIVE
SQL>
SQL>
SQL>
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES INACTIVE
3 4 YES ACTIVE
SQL> select us#, name, status$ from undo$;
US# NAME STATUS$
---------- ------------------------------ ----------
0 SYSTEM 3
1 _SYSSMU1$ 3
2 _SYSSMU2$ 3
3 _SYSSMU3$ 3
4 _SYSSMU4$ 3
5 _SYSSMU5$ 3
6 _SYSSMU6$ 3
7 _SYSSMU7$ 3
8 _SYSSMU8$ 3
9 _SYSSMU9$ 3
10 _SYSSMU10$ 3
已选择11行。
SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU1$ ONLINE
_SYSSMU2$ ONLINE
_SYSSMU3$ ONLINE
_SYSSMU4$ ONLINE
_SYSSMU5$ ONLINE
_SYSSMU6$ ONLINE
_SYSSMU7$ ONLINE
_SYSSMU8$ ONLINE
_SYSSMU9$ ONLINE
_SYSSMU10$ ONLINE
已选择11行。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
~~~~~~~~~~~~~~~~~~~~~
这里模拟回撤数据文件损坏
~~~~~~~~~~~~~~~~~~~~~
用ultraedit破坏UNDOTBS01.DBF
SQL> shutdown --因为要使用回滚,但回滚失败
ORA-00603: ORACLE 服务器会话因致命错误而终止
SQL> startup
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误,hostdef 扩展名不存在
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 3月 4 14:18:35 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
已连接。
SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> shutdown
ORA-01090: shutdown in progress - connection is not permitted
SQL> shutdown abort --只有abort才可以关闭数据库,因为不需要回滚
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU1$ NEEDS RECOVERY
_SYSSMU2$ NEEDS RECOVERY
_SYSSMU3$ NEEDS RECOVERY
_SYSSMU4$ NEEDS RECOVERY
_SYSSMU5$ NEEDS RECOVERY
_SYSSMU6$ NEEDS RECOVERY
_SYSSMU7$ NEEDS RECOVERY
_SYSSMU8$ NEEDS RECOVERY
_SYSSMU9$ NEEDS RECOVERY
_SYSSMU10$ NEEDS RECOVERY
SQL> select us#, name, status$ from undo$;
US# NAME STATUS$
---------- ------------------------------ ----------
0 SYSTEM 3
1 _SYSSMU1$ 5
2 _SYSSMU2$ 5
3 _SYSSMU3$ 5
4 _SYSSMU4$ 5
5 _SYSSMU5$ 5
6 _SYSSMU6$ 5
7 _SYSSMU7$ 5
8 _SYSSMU8$ 5
9 _SYSSMU9$ 5
10 _SYSSMU10$ 5
已选择11行。
~~~~~~~~~~~~~~~~~~~~~
这里我们注意能够打开数据库
但是这里状态是需要恢复
~~~~~~~~~~~~~~~~~~~~~~
SQL> create pfile=''c:\undopfile.ora'' from spfile;
文件已创建。
SQL> create undo tablespace UNDOTBS2 datafile ''C:\oracle\oradata\testdb\UNDOTB2.DBF'' size 50m;
表空间已创建。
SQL> select count(*),status from arch group by status;
COUNT(*) ST
---------- --
6166 no
98656 ok
SQL> insert into arch select ''af'' from dba_objects;
insert into arch select ''af'' from dba_objects
*
ERROR 位于第 1 行:
ORA-01552: 非系统表空间''USERS''无法使用系统回退段
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
编辑c:\undopfile.ora,
将设置*.undo_tablespace=''UNDOTBS2''
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> startup pfile=''c:\undopfile.ora''
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> insert into arch select ''af'' from dba_objects;
已创建6166行。
SQL> select
2 trunc(id1/power(2,16)) rbs,
3 bitand(id1,to_number(''ffff'',''xxxx''))+0 slot,
4 id2 seq,
5 lmode,request
6 from v$lock,v$session
7 where v$lock.type = ''TX''
8 and v$lock.sid = v$session.sid
9 and v$session.username is not null;
RBS SLOT SEQ LMODE REQUEST
---------- ---------- ---------- ---------- ----------
17 0 2 6 0
SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU3$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU4$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU5$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU6$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU7$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU8$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU9$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU10$ UNDOTBS1 NEEDS RECOVERY
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11$ UNDOTBS2 ONLINE
_SYSSMU12$ UNDOTBS2 ONLINE
_SYSSMU13$ UNDOTBS2 ONLINE
_SYSSMU14$ UNDOTBS2 ONLINE
_SYSSMU15$ UNDOTBS2 ONLINE
_SYSSMU16$ UNDOTBS2 ONLINE
_SYSSMU17$ UNDOTBS2 ONLINE
_SYSSMU18$ UNDOTBS2 ONLINE
_SYSSMU19$ UNDOTBS2 ONLINE
_SYSSMU20$ UNDOTBS2 ONLINE
SQL> select US#,NAME,ts#,STATUS$,FLAGS from undo$;
US# NAME TS# STATUS$ FLAGS
---------- ------------------------------ ---------- ---------- ----------
0 SYSTEM 0 3
1 _SYSSMU1$ 1 5
2 _SYSSMU2$ 1 5
3 _SYSSMU3$ 1 5
4 _SYSSMU4$ 1 5
5 _SYSSMU5$ 1 5
6 _SYSSMU6$ 1 5
7 _SYSSMU7$ 1 5
8 _SYSSMU8$ 1 5
9 _SYSSMU9$ 1 5
10 _SYSSMU10$ 1 5
US# NAME TS# STATUS$ FLAGS
---------- ------------------------------ ---------- ---------- ----------
11 _SYSSMU11$ 6 3
12 _SYSSMU12$ 6 3
13 _SYSSMU13$ 6 3
14 _SYSSMU14$ 6 3
15 _SYSSMU15$ 6 3
16 _SYSSMU16$ 6 3
17 _SYSSMU17$ 6 3 --插入数据的回滚信息在这
18 _SYSSMU18$ 6 3
19 _SYSSMU19$ 6 3
20 _SYSSMU20$ 6 3
已选择21行。
这些非online的回撤段也需要在初始化参数中强制_corrupted_rollback_segments
且_offline_rollback_segments=true
这里跟9.4一样,设置初始化文件
编辑INITtestdb_undo.ORA''
*.undo_management=''AUTO''
*.undo_retention=10800
*.undo_tablespace=''UNDOTBS1''
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
_offline_rollback_segments=true
然后打开数据库
看看TOM的例子
sys@ORA920.US.ORACLE.COM> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORA920.US.ORACLE.COM> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
[ora920@tkyte-pc-isdn ora920]$ ls
control01.ctl cwmlite01.dbf indx01.dbf redo02.log redo0B.log temp01.dbf
users01.dbf
control02.ctl drsys01.dbf odm01.dbf redo03.log redo0C.log tools01.dbf
xdb01.dbf
control03.ctl example01.dbf redo01.log redo0A.log system01.dbf
undotbs01.dbf
[ora920@tkyte-pc-isdn ora920]$ mv undotbs01.dbf undotbs01.dbf.xxx
[ora920@tkyte-pc-isdn ora920]$ sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Sat Sep 28 08:33:29 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
idle> connect / as sysdba
Connected to an idle instance.
idle> startup
ORACLE instance started.
Total System Global Area 143725064 bytes
Fixed Size 451080 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2:
''/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf''
idle> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
idle> alter system set undo_management = manual scope=spfile;
System altered.
Note: disabling the undo tablespace here, this''ll let us go back to "rollback
segments" and we''ll use the system RBS to get back on our feet
idle> shutdown
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
idle> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
[ora920@tkyte-pc-isdn ora920]$ !sql
sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Sat Sep 28 08:35:34 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
idle> connect / as sysdba;
Connected to an idle instance.
idle> startup
ORACLE instance started.
Total System Global Area 143725064 bytes
Fixed Size 451080 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2:
''/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf''
Note: we still have to get rid of that thing..
idle> alter database datafile
''/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf''
2 offline drop;
Database altered.
idle> alter database open;
Database altered.
idle> drop tablespace undotbs1;
Tablespace dropped.
idle> create UNDO tablespace undotbs1
2 datafile ''/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf'' size
25m
3 autoextend on next 1m maxsize 1024m;
Tablespace created.
idle> alter system set undo_management = auto scope=spfile;
System altered.
Now, we''ve put the undo tablespace "back" by creating a new one. Just
bounce...
idle> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.