在没备份undo的情况下,undo丢失,重启数据库报ORA-01157错误

今天做了一下undo隐藏参数的实验

在没有备份的情况下,删除正在使用的undo,然后关机

(本次使用的的oracle的隐藏参数,慎用!!!!!!!!!!!!!!)

idle> select * from V$VERSION;


BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production



sys@DNDN> startup

ORACLE instance started.


Total System Global Area  335544320 bytes
Fixed Size    2020640 bytes
Variable Size  117443296 bytes
Database Buffers  213909504 bytes
Redo Buffers    2170880 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: '/u01/app/oracle/oradata/dndn/undotbs1.dbf'




sys@DNDN> show parameter undo_t


NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace     stringUNDOTBS1


在此之前我有建立有一个未使用的undo 名字叫undotbs(区别上面的undotbs1)(*注:若没有多余的undo,则见文章最后解决办法)

sys@DNDN>shutdown immediate;

idle> startup nomount;
ORACLE instance started.


Total System Global Area  335544320 bytes
Fixed Size    2020640 bytes
Variable Size  117443296 bytes
Database Buffers  213909504 bytes
Redo Buffers    2170880 bytes


#把undo_tablespace 修改成备用的undo

idle>alter system set undo_tablespace=undotbs scope=spfile;


#把undo改成手动管理

idle> alter system set undo_management=manual scope=spfile; 

System altered.

#使用隐藏参数
idle> alter system set "_offline_rollback_segments"=true scope=spfile;


System altered.




idle> shutdown immediate;

idle> startup
ORACLE instance started.


Total System Global Area  335544320 bytes
Fixed Size    2020640 bytes
Variable Size  117443296 bytes
Database Buffers  213909504 bytes
Redo Buffers    2170880 bytes
Database mounted.
Database opened.

这样数据库就可以打开了!



查看UNDOTBS1  (之前丢失的表空间) 中的段的状态是否都是offline

idle> select segment_name,tablespace_name,status from dba_rollback_segs;


SEGMENT_NAME        TABLESPACE_NAME      STATUS
------------------------------ ------------------------------ ----------------
SYSTEM        SYSTEM      ONLINE
_SYSSMU1$        UNDOTBS1       OFFLINE
_SYSSMU2$        UNDOTBS1       OFFLINE
_SYSSMU3$        UNDOTBS1       OFFLINE
_SYSSMU4$        UNDOTBS1       OFFLINE
_SYSSMU5$        UNDOTBS1       OFFLINE
_SYSSMU6$        UNDOTBS1       OFFLINE
_SYSSMU7$        UNDOTBS1      OFFLINE
_SYSSMU8$        UNDOTBS1     OFFLINE
_SYSSMU9$        UNDOTBS1      OFFLINE
_SYSSMU10$        UNDOTBS1    OFFLINE
_SYSSMU11$        UNDOTBS      OFFLINE
_SYSSMU12$        UNDOTBS      OFFLINE
_SYSSMU13$        UNDOTBS      OFFLINE
_SYSSMU14$        UNDOTBS      OFFLINE
_SYSSMU15$        UNDOTBS      OFFLINE
_SYSSMU16$        UNDOTBS      OFFLINE
_SYSSMU17$        UNDOTBS      OFFLINE
_SYSSMU18$        UNDOTBS      OFFLINE
_SYSSMU19$        UNDOTBS      OFFLINE
_SYSSMU20$        UNDOTBS      OFFLINE


21 rows selected.

若UNDOTBS1  (之前丢失的表空间) 中的段的状态都是offline,则可以删除该undo表空间(否则,则要用到另一个隐藏参数"_corrupted_rollback_segments"把不为offline的段全用此参数设置即可删除该undo表空间 eg: alter system set "_corrupted_rollback_segments"='_SYSSMU8$' scope=spfile;或 alter system set "_corrupted_rollback_segments"='_SYSSMU8$','_SYSSMU9$' scope=spfile)


idle> drop tablespace undotbs1 including contents and datafiles;


当然打开后还要重置一下undo_management和_offline_rollback_segments

idle> alter system set undo_management=auto scope=spfile;


System altered.


idle> alter system reset  "_offline_rollback_segments" scope=spfile sid='*';


System altered.



idle>shutdown immediate;


idle> startup
ORACLE instance started.


Total System Global Area  335544320 bytes
Fixed Size    2020640 bytes
Variable Size  121637600 bytes
Database Buffers  209715200 bytes
Redo Buffers    2170880 bytes
Database mounted.
Database opened.


ok!!!!!!


上面说的是有未使用的undo表空间的情况,若只有一个undo,且丢失损坏,则在数据库重启报错后,先设置隐藏参数_offline_rollback_segments和undo_management,重启,会再报错,再把这个undo给offline,就可以打开了,打开之后 删除丢失或损坏的undo,重建undo,修改参数文件指定undo,重置参数上面, 重启即可。(主要大概思路同上面方法)


注:隐藏参数

idle> select ksppinm from x$ksppi where ksppinm like '%roll%';


KSPPINM
--------------------------------------------------------------------------------
transactions_per_rollback_segment
rollback_segments
_rollback_segment_initial
_rollback_segment_count
_offline_rollback_segments
_corrupted_rollback_segments
_cleanup_rollback_entries
_rollback_stopat
fast_start_parallel_rollback
_mv_rolling_inv


10 rows selected.




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误一般是由于 undo 表空间损坏或不存在导致的。 首先,你可以检查一下数据库中是否存在该 undo 表空间,可以通过执行以下 SQL 语句进行检查: ``` SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name='<undo_tablespace_name>'; ``` 其中 `<undo_tablespace_name>` 应该替换成你要检查的 undo 表空间的名称。 如果查询结果为空,说明该表空间不存在,你需要创建一个新的 undo 表空间。如果查询结果不为空,则需要进一步检查该 undo 表空间是否正常。 你可以执行以下 SQL 语句检查 undo 表空间是否正常: ``` SELECT status FROM v$rollstat WHERE segment_name='<undo_tablespace_name>'; ``` 其中 `<undo_tablespace_name>` 应该替换成你要检查的 undo 表空间的名称。 如果查询结果为 `ONLINE`,则说明该 undo 表空间正常。如果查询结果为 `OFFLINE` 或者其他异常状态,则说明该 undo 表空间存在问题,需要进行修复或者重建。 如果你需要创建一个新的 undo 表空间,可以执行以下 SQL 语句: ``` CREATE UNDO TABLESPACE <undo_tablespace_name> DATAFILE '<path_to_undo_datafile>' SIZE <size_in_MB>; ``` 其中 `<undo_tablespace_name>` 是你要创建的 undo 表空间名称,`<path_to_undo_datafile>` 是你要指定的 undo 数据文件路径,`<size_in_MB>` 是你要指定的 undo 表空间大小,单位为 MB。 如果你需要修复一个存在问题的 undo 表空间,可以参考以下步骤: 1. 首先备份undo 表空间对应的数据文件,以防止数据丢失。 2. 尝试在线修复该 undo 表空间,你可以执行以下 SQL 语句: ``` ALTER TABLESPACE <undo_tablespace_name> BEGIN BACKUP; ALTER TABLESPACE <undo_tablespace_name> END BACKUP; ``` 这两条 SQL 语句可以将该 undo 表空间置于备份模式,然后再退出备份模式。如果该 undo 表空间存在一些逻辑损坏,这两条 SQL 语句可能会修复这些问题。 3. 如果在线修复失败,你可以尝试离线修复该 undo 表空间,你可以执行以下 SQL 语句: ``` ALTER DATABASE DATAFILE '<path_to_undo_datafile>' OFFLINE; RECOVER DATAFILE '<path_to_undo_datafile>'; ALTER DATABASE DATAFILE '<path_to_undo_datafile>' ONLINE; ``` 这三条 SQL 语句可以将该 undo 数据文件置为离线状态,然后进行数据文件恢复,最后再将该数据文件置为在线状态。 4. 如果无法修复该 undo 表空间,你可以考虑重建该 undo 表空间,你可以执行以下 SQL 语句: ``` DROP TABLESPACE <undo_tablespace_name> INCLUDING CONTENTS AND DATAFILES; CREATE UNDO TABLESPACE <undo_tablespace_name> DATAFILE '<path_to_undo_datafile>' SIZE <size_in_MB>; ``` 这两条 SQL 语句可以先删除存在问题的 undo 表空间,然后重新创建一个新的 undo 表空间。请注意,这个操作会删除该 undo 表空间中的所有数据,所以请务必提前备份数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值