ORA-01157/ORA-01110故障处理

  oracel回退文件UNDOTBS01.DBF损坏后,oracle数据库不能装载,数据无法读取。上星期五,jh区局发生了这种情况。
  发生问题后有两种处理方式:有备份的情况和没有备份的情况;
  有备份的情况:
  1、删除坏的UNDOTBS01.DBF,将备份的回退文件UNDOTBS01.DBF拷回原处;
  2、进入SQLPLUS;
   3、startup;
  系统出错提示:
  ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
  ORA-01110: data file 2: '/home/oracle/oradata/esal/undotbs01.dbf'
  4、recover database;
   系统自动恢复;
  5、alert database open;
   成功打开数据库;
  无备份的情况:
  1、删除坏的UNDOTBS01.DBF;
  2、连接到数据库
  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'
  3 查看rollback_segments
  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.
  ...
    Database mounted.
    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离线;
  SQL> alter database datafile '/home/oracle/oradata/esal/undotbs01.dbf' offline drop;
  Database altered.
  SQL> alter database open;
  Database altered.
  7删除undotbs01
   SQL> drop tablespace undostb01;
   Tablespace dropped.
  8创建新的UNDO文件
   SQL> create undo tablespace undotbs1 datafile '/home/oracle/oradata/esal/undotbs01.dbf' size 200M autoextend on;
Tablespace created.
   9修改参数文件;
  SQL> create spfile from pfile;
 File created.
  将参数文件修改如下:
  ###########################################
  # System Managed Undo and Rollback Segments
  ###########################################
  undo_management=AUTO
  undo_retention=10800
  undo_tablespace=undotbs01
  10重新打开数据库
  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.

posted @ 2013-03-10 22:25  light0sky  阅读(2002)  评论(0编辑  收藏  举报