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进新数据库里。
至此,数据库恢复完毕。此方法不到万不得已不建议采用,最好的方法是用以前的数据文件的备份来做恢复,因为用加隐含参数的方法将数据库打开后,此时数据库有可能数据会不一致,因为对于回滚段里有活动事物的时候,数据库可能会丢失一些数据,主要是回滚段里有活动事物的那部分数据,因此做好数据库的备份是至关重要的,这样对于恢复起来就很简单方便。
分享到:
相关推荐
### Oracle UNDO表空间管理详解 #### 一、概述 在Oracle数据库中,UNDO表空间扮演着极其重要的角色,特别是在事务处理与数据恢复方面。本文将深入浅出地介绍Oracle 10g/11g版本中的UNDO表空间管理机制。 #### 二...
oracle Undo表空间管理,oracle 学习人员必看的不可缺少的资料。
在Oracle数据库管理中,有时需要对Undo表空间进行管理和优化。特别是当Undo表空间因为历史数据积累而变得过大时,可能会影响数据库性能。本文将详细介绍如何通过新建一个Undo表空间并替换原有的Undo表空间来实现其...
在Oracle数据库管理中,Undo表空间扮演着极其重要的角色。它主要用于存储事务处理过程中产生的Undo记录,这些记录对于事务回滚、一致性读取以及恢复操作至关重要。然而,在实际应用过程中,可能会出现Undo表空使用...
通过以上介绍可以看出,在Oracle数据库中,正确管理和优化Temp表空间和UNDO表空间是非常重要的,尤其是对于那些执行大量排序、分组操作以及频繁进行事务处理的应用系统来说。合理利用Resize调整大小、替换原有表空间...
在Oracle数据库管理中,UNDO表空间是非常重要的组成部分之一,主要用于存储事务处理期间的回滚信息。当UNDO表空间的数据文件丢失时,可能会导致数据库无法正常运行,甚至引发数据丢失的风险。本文将详细介绍Oracle ...
Oracle数据库在面对UNDO表空间持续增长的问题时,通常涉及...此外,定期维护和备份是防止类似问题的关键,同时,了解和熟悉Oracle数据库的内部机制,如SMON进程的作用和UNDO表空间管理,对快速定位和解决问题至关重要。
- 自动管理:Oracle 9i引入了自动 Undo 管理(Automatic Undo Management, AUM),默认情况下,数据库会自动管理undo表空间,包括分配和回收空间。 - 手动管理:在AUM之前,管理员需要手动创建和管理undo段,这...
在Oracle 12c数据库中,表空间管理、用户和角色、临时Undo是数据库管理的关键组成部分。以下是对这些内容的详细解释和操作方法: 一、创建表空间 在Oracle 12c中,创建表空间主要涉及到声明一个新的逻辑区域,用于...
标题和描述均提到了“undo表空间恢复”,这在Oracle数据库管理中是一个关键主题,尤其对于数据恢复和事务处理有着重要影响。以下是对这一知识点的深入解析: ### 一、Undo表空间概述 Undo表空间是Oracle数据库中...
在Oracle数据库系统中,"undo表空间"是一个至关重要的组成部分,它主要负责存储事务的回滚(rollback)信息。本文将深入探讨undo表空间的概念、作用、管理以及常见问题的处理,帮助你全面理解并有效地解决数据库undo...
Oracle 9i数据库引入了一项重要的改进,即自动Undo表空间管理,这极大地简化了数据库管理员对于回退段的管理工作。回退段是Oracle数据库中一个关键的组成部分,它存储了事务对数据进行修改前的原始值,这些信息用于...
在Oracle数据库管理中,`undo表空间`的管理是一项至关重要的任务。它不仅关乎数据的一致性和完整性,还直接影响到数据库的性能。本文将从DML语句与undo的关系入手,深入探讨undo在Oracle数据库中的作用及管理方式。 ...
1. **Oracle 表空间(Tablespaces)**:表空间是Oracle数据库中存储数据的基本单位,它由一个或多个数据文件组成。每个表、索引和其他对象都会被分配到特定的表空间中。理解表空间的工作原理对于管理数据库空间至关...
Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个...如果使用自动管理模式,必须设置该参数为AUTO,此时采用UNDO表空间管理UNDO数据;如果使用手工管理模式,必须设置该值为MANUAL,此时采用回滚段管理UNDO数据。
Oracle提供自动Undo管理,通过设置UNDO_MANAGEMENT=AUTO和UNDO_TABLESPACE=UNDOTBS1,数据库将自动处理Undo空间的管理。这样可以减少DBA的维护工作,但仍然需要根据系统负载和事务特性来合理调整Undo表空间的大小,...
### Oracle 9i数据库中自动Undo表空间管理 #### 一、引言 随着数据库技术的发展,Oracle数据库作为业界领先的关系型数据库管理系统之一,不断推出新的功能和技术来提高其性能和易用性。Oracle 9i是Oracle公司推出...
4. Oracle 12c R2 支持本地 Undo 模式(Local Undo Mode),每个 PDB 可以有自己的 Undo 表空间,提供更灵活的管理。 5. 自动 Undo 管理(Automatic Undo Management, AUM)是默认设置,它将 Undo 存储在 Undo 表...
数据表空间的管理则更为灵活,可以根据用户需求创建新的表空间,分配不同的数据文件,并进行空间管理和监控。 在学习 Oracle 用户和表空间的过程中,读者应关注以下几点: 1. 用户命名需遵循 Oracle 的命名规则,...
undo 段和表段、索引段类似,但是 undo 段是由 Oracle 自行管理的,称为自动回滚段管理。相比手动回滚段的管理方式,自动回滚段的管理方式的优势是 Oracle 会在需要的时候创建,不需要的时候删除,在空间不足的时候...