当前位置:  数据库>oracle

undo表空间修复小结

    来源: 互联网  发布时间:2017-06-17

    本文导语: 首先要知道回滚段在自动管理undo表空间下是不能被offline和删除的,可以先改成manual之后操作, 我们知道undo表空间是用来存储数据被改之前的前镜像,那么如果出现问题,可以分两种情况来处理; 第一种情况:如果损坏的回滚...

首先要知道回滚段在自动管理undo表空间下是不能被offline和删除的,可以先改成manual之后操作, 我们知道undo表空间是用来存储数据被改之前的前镜像,那么如果出现问题,可以分两种情况来处理;
第一种情况:如果损坏的回滚段没有正在执行的事务,那问题还相对简单,可以直接删除掉该回滚段即可,并且没有数据丢失。

具体过程:假设文件undotbs01.dbf丢失或者损坏。

1.先把数据文件offline,在mount状态下执行:

SQL>alter database datafile '/software/oradata/JLPROJCT/undotbs01.dbf' offline drop ; 

2,打开数据库

SQL>alter  database open;

3.我们知道一个数据文件对应n个undo段,所有现在已经有好多undo 段已经 offline了,我们先不对他做任何操作,先查看不是offline的undo段,你会发现他们是不是offline的这些undo段是需要恢复(need recover)

SQL> select status,count(*) from dba_rollback_segs group by status;

STATUS            COUNT(*)

---------------- ----------

ONLINE                  23

need recovery        5

OFFLINE                143

SQL>select segment_name,status from dba_rollback_segs where status'offline';  就会发现所有用户回滚段是需要恢复的,状态是need recovery.,这个语句不会显示由于数据文件损坏而出现offline的回滚段。

SEGMENT_NAME                  STATUS

------------------------------ ----------------

SYSTEM                                        ONLINE                    ###这是系统回滚段。

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery

4.新建一个回滚表空间,

SQL>create  undo tablespace undo2  datafile  '/software/oradata/JLPROJCT/undotbs02.dbf'  size 100m ;
 

 tablespace created

5,把回滚段设置成人工管理,然后删除损坏的回滚段。

SQL>alter system set undo_tablespace= 'undo2'  scope=spfile;  ##指定成新建的undo表空间。
 

system altered 

SQL>alter system set undo_management='manual'  scope=spfile;

system altered
 

6,创建pfile

SQL>create pfile='/Oracle/app/pfile.ora  from spfile;
 

file created 

7,一致性关闭数据库,

SQL>shu  immediate
 

8,在pfile 文件中添加一个隐藏参数,把这些回滚段都列在这个参数值里,

*._offline_rollback_segment=('_SYSSMU154_3691636531$','_SYSSMU155_3686385895$','_SYSSMU156_3796802683$','_SYSSMU157_2723916652$','_SYSSMU158_1435464080$')

9,创建成spfile  然后启动数据库。

SQL>create spfile  from pfile;
 

spfile created 

SQL>startup

10,这时候回滚段数量并没有发生改变,

SQL>select segment_name,status from dba_rollback_segs where status'offline'; 

SEGMENT_NAME                  STATUS

------------------------------ ----------------

SYSTEM                                        ONLINE           

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery
11,因为是手工管理,可以直接删除掉那些回滚段。
SQL> drop rollback segment  “_SYSSMU154_3691636531$”;

rollback segment droped
 

.

.

.

.

12,然后删掉原来的undo表空间。

SQL>drop tablespace undo1  including contents;

13,然后重启数据库,

shu immediate 

startup 

14,注意这时候你的undo 管理还是手工的,所以要把之前的修改改正会自动管理。并且把添加的隐含参数*._offline_rollback_segment删掉。

SQL>alter system set undo_management='auto'  scope=spfile;

第二种情况:当损坏的undo 表空间的回滚段上还有活动的事务,这种情况就要强行提交这些事务,就会造成一些数据的丢失。

1,启动数据库到mount状态,只能启动到这里,

2,把有问题的回滚段offline

SQL>alter database datafile '/software/oradata/JLPROJCT/undotbs01.dbf' offline drop ;

3,查看回滚段状态,和第一种情况略有不同,她没有offline的回滚段。

SQL>select usn,xacts from v$rollstat;

SQL> select status,count(*) from dba_rollback_segs group by status;

STATUS            COUNT(*)

---------------- ----------

ONLINE                  23

need recovery        5

QL>select segment_name,status from dba_rollback_segs where status'offline'; 

SEGMENT_NAME                  STATUS

------------------------------ ----------------         

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery

  4,试图创建发现报错,真正工作中可以从这里来判断到底是那种情况,第一种情况是可以重新建立的。
 必须先禁止继续使用旧的回滚段和回滚空间: 

SQL>create pfile=/oracle/app/pfile.ora  from spfile
 

file created 

SQL>shutdown  immediate ;

在pfile中添加并修改以下内容:

*.undo_management='manual'  ###手动管理,才可以删除回滚段

*._offline_rollback_segments=('_SYSSMU154_3691636531$','_SYSSMU155_3686385895$','_SYSSMU156_3796802683$','_SYSSMU157_2723916652$','_SYSSMU158_1435464080$')      ###这样才能删除这些回滚段

*.undo_tablespace='undo2'    ###这样就会让以后的事务不在用旧的回滚段和undo表空间,

5.创建成spfile  然后启动数据库。

SQL>create spfile  from pfile;
 

spfile created 

SQL>startup 

6,删除旧的回滚段和回滚表空间:

SQL>drop rollbackup segment  '_SYSSMU154_3691636531$'  ;

'

'

'

'

把need recovery 的回滚段全部删除后,

SQL>drop undo tablespace undo1 including  contents;  ###因为已经丢失,就不必要添加数据文件了(and datafiles 选项了)

7,创建一个新的undo表空间,然后启动数据库,再修改undo_management 为自动。

注意这样后,所有未提交的事务都当做提交处理了。

总结:要是undo出现问题,你可以先把数据文件offline,然后修改undo_management 为manual,之后查出状态need recover 的回滚段,修改隐含参数 *._offline_rollback_segments ,把需要删除的(状态为need recover 的回滚段)添加进来,然后删除他们。重新创建undo表空间,然后undo_tablespace=新创建的表空间,打开数据库,最后把undo_management =auto ,即可。

--------------------------------------------------------------------------------

RMAN备份与恢复之undo表空间丢失

关于Oracle 释放过度使用的undo表空间

Oracle undo的一些理解

Oracle undo 镜像数据探究

Oracle 回滚(ROLLBACK)和撤销(undo)

Linux-6-64下安装Oracle 12C笔记

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2

--------------------------------------------------------------------------------


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.swing.undo类stateedit的类成员方法: undo定义及介绍
  • Oracle释放undo表空间
  • java命名空间javax.swing.undo接口undoableedit的类成员方法: undo定义及介绍
  • 如何Shrink Undo表空间,释放过度占用的空间
  • java命名空间javax.swing.undo类undomanager的类成员方法: undo定义及介绍
  • java命名空间javax.swing.undo类abstractundoableedit的类成员方法: undo定义及介绍
  • java命名空间javax.swing.text类defaultstyleddocument.attributeundoableedit的类成员方法: undo定义及介绍
  • java命名空间javax.swing.text类abstractdocument.defaultdocumentevent的类成员方法: undo定义及介绍
  • java命名空间javax.swing.text类abstractdocument.elementedit的类成员方法: undo定义及介绍
  • java命名空间java.awt.event类keyevent的类成员方法: vk_undo定义及介绍
  • java命名空间javax.swing.undo类compoundedit的类成员方法: edits定义及介绍
  • java命名空间javax.swing.undo接口undoableedit的类成员方法: getundopresentationname定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: edittobeundone定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: canundoorredo定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: undoorredo定义及介绍
  • java命名空间javax.swing.undo类stateedit的类成员方法: poststate定义及介绍
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: updatelevel定义及介绍
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: createcompoundedit定义及介绍
  • java命名空间javax.swing.undo类stateedit的类成员方法: end定义及介绍
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: compoundedit定义及介绍
  • java命名空间javax.swing.undo类cannotredoexception的类成员方法: cannotredoexception定义及介绍
  • java命名空间javax.swing.undo类stateedit的类成员方法: object定义及介绍
  • Oracle 管理Undo数据
  • java命名空间javax.swing.undo类stateedit的类成员方法: prestate定义及介绍
  • semop不使用SEM_UNDO的问题
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: beginupdate定义及介绍
  • linux command无法撤消mv命令,在linux下没有undo.刚google下,看到老外说的一句比较经典的话。
  • java命名空间javax.swing.undo类stateedit的类成员方法: rcsid定义及介绍
  • [Oracle] 解析在没有备份的情况下undo损坏怎么办
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: getupdatelevel定义及介绍
  • Oracle undo_management参数不一致错误


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3