`
hanjian861202
  • 浏览: 165030 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Oracle:undo表空间管理

 
阅读更多

Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段.


 

  我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要指定一个UNDO 表空间。 如果设为man l,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以man l方式启动,即使设置了auto方式的参数,这些参数将被忽略。

当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。

 

SQL> show parameter undo

NAME                   TYPE        VAL

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

undo_management          string      AUTO

undo_retention             integer     900

undo_tablespace            string      UNDOTBS1


参考:Oracle undo 管理

http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx

 

 


一. UNDO 表空间


下面来看一下undo 的表空间管理。先来查看一下表空间的使用情况:


/* Formatted on 2010/6/23 9:46:58 (QP5 v5.115.810.9015) */

SELECT   a.tablespace_name,

         ROUND (a.total_size) "total_size(MB)",

         ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",

         ROUND (b.free_size, 3) "free_size(MB)",

         ROUND (b.free_size / total_size * 100, 2) || '%' free_rate

  FROM   (  SELECT   tablespace_name, SUM (bytes) / 1024 / 1024 total_size

              FROM   dba_data_files

          GROUP BY   tablespace_name) a,

         (  SELECT   tablespace_name, SUM (bytes) / 1024 / 1024 free_size

              FROM   dba_free_space

          GROUP BY   tablespace_name) b

 WHERE   a.tablespace_name = b.tablespace_name(+);


TABLESPACE_NAME      total_size(MB) used_size(MB) free_size(MB) FREE_RATE

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


SYSAUX                   580       545.187        34.813  6%

UNDOTBS1                 90        23.875        66.125  73.47%

DAVE                      20          6.25         13.75  68.75%

USERS                     10         8.375         1.625  16.25%

SYSTEM                   960       951.062         8.938  93%


从结果我们看到UNDO 表空间已经用了23.875M。 我们看一下这使用的23M空间里空闲和非空闲比例:

/* Formatted on 2010/6/23 9:49:53 (QP5 v5.115.810.9015) */

  SELECT   tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"

    FROM   dba_undo_extents

GROUP BY   tablespace_name, status;


TABLESPACE_NAME      STATUS      Bytes(M)

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

UNDOTBS1             UNEXPIRED     9.1875

UNDOTBS1             EXPIRED      13.6875


我们看一下查询的结果,UNEXPIRED 和EXPIRED 是已使用的undo 表空间,其中expired 说明是已经过期的数据,也就是15分钟(默认情况)以外的数据,以被覆盖,可以认为是空闲的。

 

在此补充一点知识:

采用UNDO 表空间时,会有一个参数UNDO_RETENTION,该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改,通常默认是900 秒,也就是15 分钟。


undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。


undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。


只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention G rantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,例如:

SQL> Alter tablespace undotbs1 retention g rantee;

 

禁止undo 表空间retention g rantee,例如:

SQL> Alter tablespace undotbs1 retention nog rantee;

 

总结一下:

UNDO 表空间是会被重用的,只有当事务没结束,或开了retention g rantee,或在undo_retention时间内不能被重用。

在undo_retention规定的时间内,数据都是有效的,过期后都会设为无效,状态被改为Expired,这些回滚段将会被看作Free Space。但是只要数据没有被覆盖就可以使用。如果空间已满,新事务的数据会自动覆盖掉已经提交的事务数据,即使在undo_retention的时间内。除非指定Retention G rantee模式,才能保证在undo_retention内不被覆盖。

 

 

二. UNDO 表空间满了的处理方法


2.1 先模拟UNDO 表空间满的情况


SQL>  alter system set undo_retention=10800; -- 3个小时
系统已更改。
SQL> create undo tablespace undo datafile 'F:\backup\undo.dbf' size 1m ;
表空间已创建。
SQL> alter tablespace undo retention g rantee;
表空间已更改。
SQL> alter system set undo_tablespace=undo;
系统已更改。

SQL> create table DBA(id number);

表已创建。
SQL> begin

  2  for i in 1 .. 100000 loop

  3  insert into dba vals(i);

  4  commit;

  5  end loop;

  6  end;

  7  /

begin

*

第 1 行出现错误:

ORA-30036: 无法按 8 扩展段 (在还原表空间 'UNDO' 中)

ORA-06512: 在 line 3


2.2 处理方法

处理方法有两种,一是添加undo 表空间的数据文件,二是切换UNDO tablespace. 这种情况下多用在undo 表空间已经非常大的情况。


2.2.1 增加数据文件

SQL> ALTER TABLESPACE undo ADD DATAFILE 'F:\backup\undo02.dbf' size 100M reuse;

表空间已更改。

SQL> begin

  2  for i in 1..100000 loop

  3  insert into dba vals(1);

  4  commit;

  5  end loop;

  6  end;

  7  /

PL/SQL 过程已成功完成。

 

2.2.2 切换UNDO 表空间


1、建立新的表空间UNDOTBS2

SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'F:\backup\undo03.dbf' size 100M reuse;

表空间已创建。


2、切换到新建的UNOD表空间上来,操作如下
SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;

系统已更改。


3、将原来的UNDO表空间,置为脱机:
SQL> alter tablespace UNDO offline;


表空间已更改。


4、删除原来的UNDO表空间:
SQL> drop tablespace UNDO incl ing contents AND DATAFILES CASCADE CONSTRAINTS ;

表空间已删除。


如果只是drop tablespace UNDO ,则只会在删除控制文件里的记录,并不会物理删除文件。

Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用incl ing contents。

 

 


三. 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 表空间。

 

3.1 创建pfile 文件

SQL> create pfile='F:\initorcl.ora' from spfile;

文件已创建。
3.2 修改pfile文件
#*.undo_tablespace='UNDOTBS1'

#*.undo_management='AUTO'

undo_management='MAN L'

rollback_segments='SYSTEM'


3.3 启动数据库至Mount 状态

SQL> STARTUP MOUNT pfile='F:\initorcl.ora' ;


3.4 offline drop undo 表空间

 SQL> ALTER DATABASE DATAFILE 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF' OFFLINE DROP;


3.5 open 数据库

SQL> ALTER DATABASE OPEN;


3.6 删除旧的undo 表空间

SQL> DROP TABLESPACE UNDOTBS1 INCL ING CONTENTS;  

注:该命令不会删除物理文件。 要想一起删除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ;

如:  drop tablespace UNDOTBS1 incl ing contents AND DATAFILES CASCADE CONSTRAINTS ;


3.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;

表空间已创建。


3.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


3.9 修改pfile 参数

*.undo_tablespace='UNDOTBS1'

*.undo_management='AUTO'

#undo_management='MAN L'

#rollback_segments='SYSTEM'


3.10 用刚才修改的pfile 启动数据库,并创建spfile

SQL> startup pfile='F:\initorcl.ora' ;

SQL> create spfile from pfile='F:\initorcl.ora';


3.10 再次shutdown,用spfile 启动.

SQL> shutdown immediate

SQL> startup

 

 

一般数据文件损坏的情况也可以采用类似的方法, 先启动到mount, 在将损坏的数据文件offline drop。 在open 数据库,drop 掉损坏的数据文件。 当然这种做法有数据丢失。 能恢复的话,尽量恢复。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5689558.aspx

 

 

========================================================================================

 

oracle9i回滚段表空间数据文件损坏或丢失后的恢复方法:

由于oracle回滚段表空间数据文件丢失导致数据库起不来,报ora-01157错误,对于回滚段数据文件丢失后的恢复,处理方法有很多,本例主要是用oracle隐含参数来恢复数据库的一个例子:

隐含参数的含义:

SQL> select KSPPDESC from X$KSPPI where ksppinm=’_corrupted_rollback_segments’;

KSPPDESC
—————————————————————-
corrupted undo segment list

具体操作步骤如下:

首先把初始化参数init.ora文件里自动管理改为手工管理,然后加入隐含参数:
#undo_management=AUTO
undo_tablespace=UNDOTBS
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)  

SQL>startup restrict  mount  (数据库启动到mount状态)
SQL> alter database datafile ‘D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF’ offline drop;
Database altered.

SQL>alter database open;
Database opened.
SQL> show parameter undo

NAME TYPE VALUE
———————————— ———– ———
undo_management string MANUAL
undo_retention integer 900
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS

SQL> drop tablespace undotbs including contents;  (假如回滚段里有活动事物,undo表空间可能会drop不掉,本例是回滚段里没有活动事物的时候)
Tablespace dropped.

重建undotbs表空间:
SQL> create undo tablespace undotbs datafile ‘D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF’
size 100M;
Tablespace created.

SQL> shutdown immediate  (关闭数据库)
Database closed.
Database dismounted.
ORACLE instance shut down.

编辑init.ora初始化参数文件,去掉隐含参数,设置
undo_management=AUTO
undo_tablespace=UNDOTBS
保存初始化参数init.ora文件,然后执行
SQL> startup mount
ORACLE instance mounted.
Total System Global Area 114061244 bytes
Fixed Size 282556 bytes
Variable Size 79691776 bytes
Database Buffers 33554432 bytes
Redo Buffers 532480 bytes
Database mounted.

SQL>alter database datafile ‘D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF’ online;
Database altered.

SQL>alter database open;
Database opened.
SQL> show parameter undo

NAME TYPE VALUE
———————————— ———– ——————————
undo_management string AUTO
undo_retention integer 900
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS

建议用隐含参数将数据库open后,立刻做个exp全备,如果数据量不大的话,最好的方法是重新建库,将exp出来的数据再imp进新数据库里。

至此,数据库恢复完毕。此方法不到万不得已不建议采用,最好的方法是用以前的数据文件的备份来做恢复,因为用加隐含参数的方法将数据库打开后,此时数据库有可能数据会不一致,因为对于回滚段里有活动事物的时候,数据库可能会丢失一些数据,主要是回滚段里有活动事物的那部分数据,因此做好数据库的备份是至关重要的,这样对于恢复起来就很简单方便。

分享到:
评论

相关推荐

    UNDO表空间管理

    ### Oracle UNDO表空间管理详解 #### 一、概述 在Oracle数据库中,UNDO表空间扮演着极其重要的角色,特别是在事务处理与数据恢复方面。本文将深入浅出地介绍Oracle 10g/11g版本中的UNDO表空间管理机制。 #### 二...

    oracle Undo表空间管理

    oracle Undo表空间管理,oracle 学习人员必看的不可缺少的资料。

    oracle 收缩undo表空间

    在Oracle数据库管理中,有时需要对Undo表空间进行管理和优化。特别是当Undo表空间因为历史数据积累而变得过大时,可能会影响数据库性能。本文将详细介绍如何通过新建一个Undo表空间并替换原有的Undo表空间来实现其...

    脚本-Oracle释放过度使用的Undo表空间

    在Oracle数据库管理中,Undo表空间扮演着极其重要的角色。它主要用于存储事务处理过程中产生的Undo记录,这些记录对于事务回滚、一致性读取以及恢复操作至关重要。然而,在实际应用过程中,可能会出现Undo表空使用...

    Oracle的Temp表空间和UNDO表空间的处理

    通过以上介绍可以看出,在Oracle数据库中,正确管理和优化Temp表空间和UNDO表空间是非常重要的,尤其是对于那些执行大量排序、分组操作以及频繁进行事务处理的应用系统来说。合理利用Resize调整大小、替换原有表空间...

    oracle 9i UNDO表空间数据文件丢失恢复

    在Oracle数据库管理中,UNDO表空间是非常重要的组成部分之一,主要用于存储事务处理期间的回滚信息。当UNDO表空间的数据文件丢失时,可能会导致数据库无法正常运行,甚至引发数据丢失的风险。本文将详细介绍Oracle ...

    地震前兆Oracle数据库UNDO表空间持续增长修复.pdf

    Oracle数据库在面对UNDO表空间持续增长的问题时,通常涉及...此外,定期维护和备份是防止类似问题的关键,同时,了解和熟悉Oracle数据库的内部机制,如SMON进程的作用和UNDO表空间管理,对快速定位和解决问题至关重要。

    Oracle中重做undo表空间

    - 自动管理:Oracle 9i引入了自动 Undo 管理(Automatic Undo Management, AUM),默认情况下,数据库会自动管理undo表空间,包括分配和回收空间。 - 手动管理:在AUM之前,管理员需要手动创建和管理undo段,这...

    Oracle 12c中的表空间管理、用户和角色、临时Undo.pdf

    在Oracle 12c数据库中,表空间管理、用户和角色、临时Undo是数据库管理的关键组成部分。以下是对这些内容的详细解释和操作方法: 一、创建表空间 在Oracle 12c中,创建表空间主要涉及到声明一个新的逻辑区域,用于...

    undo表空间恢复

    标题和描述均提到了“undo表空间恢复”,这在Oracle数据库管理中是一个关键主题,尤其对于数据恢复和事务处理有着重要影响。以下是对这一知识点的深入解析: ### 一、Undo表空间概述 Undo表空间是Oracle数据库中...

    数据库undo表空间问题集锦

    在Oracle数据库系统中,"undo表空间"是一个至关重要的组成部分,它主要负责存储事务的回滚(rollback)信息。本文将深入探讨undo表空间的概念、作用、管理以及常见问题的处理,帮助你全面理解并有效地解决数据库undo...

    Oracle 9i数据库中自动Undo表空间管理.pdf

    Oracle 9i数据库引入了一项重要的改进,即自动Undo表空间管理,这极大地简化了数据库管理员对于回退段的管理工作。回退段是Oracle数据库中一个关键的组成部分,它存储了事务对数据进行修改前的原始值,这些信息用于...

    管理undo表空间全面分析详解

    在Oracle数据库管理中,`undo表空间`的管理是一项至关重要的任务。它不仅关乎数据的一致性和完整性,还直接影响到数据库的性能。本文将从DML语句与undo的关系入手,深入探讨undo在Oracle数据库中的作用及管理方式。 ...

    oracle定时删除表空间的数据并释放表空间

    1. **Oracle 表空间(Tablespaces)**:表空间是Oracle数据库中存储数据的基本单位,它由一个或多个数据文件组成。每个表、索引和其他对象都会被分配到特定的表空间中。理解表空间的工作原理对于管理数据库空间至关...

    Oracle_Undo与Redo的通俗

    Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个...如果使用自动管理模式,必须设置该参数为AUTO,此时采用UNDO表空间管理UNDO数据;如果使用手工管理模式,必须设置该值为MANUAL,此时采用回滚段管理UNDO数据。

    oracle undo详解

    Oracle提供自动Undo管理,通过设置UNDO_MANAGEMENT=AUTO和UNDO_TABLESPACE=UNDOTBS1,数据库将自动处理Undo空间的管理。这样可以减少DBA的维护工作,但仍然需要根据系统负载和事务特性来合理调整Undo表空间的大小,...

    Oracle 9i数据库中自动Undo表空间管理 (2005年)

    ### Oracle 9i数据库中自动Undo表空间管理 #### 一、引言 随着数据库技术的发展,Oracle数据库作为业界领先的关系型数据库管理系统之一,不断推出新的功能和技术来提高其性能和易用性。Oracle 9i是Oracle公司推出...

    Oracle 12c Undo数据管理分析.pptx

    4. Oracle 12c R2 支持本地 Undo 模式(Local Undo Mode),每个 PDB 可以有自己的 Undo 表空间,提供更灵活的管理。 5. 自动 Undo 管理(Automatic Undo Management, AUM)是默认设置,它将 Undo 存储在 Undo 表...

    Oracle用户(user)和表空间(tablespace).pdf

    数据表空间的管理则更为灵活,可以根据用户需求创建新的表空间,分配不同的数据文件,并进行空间管理和监控。 在学习 Oracle 用户和表空间的过程中,读者应关注以下几点: 1. 用户命名需遵循 Oracle 的命名规则,...

    oracle undo

    undo 段和表段、索引段类似,但是 undo 段是由 Oracle 自行管理的,称为自动回滚段管理。相比手动回滚段的管理方式,自动回滚段的管理方式的优势是 Oracle 会在需要的时候创建,不需要的时候删除,在空间不足的时候...

Global site tag (gtag.js) - Google Analytics