undo_retention简单定义,就是最多数据的最少保留时间。AUM模式下,undo_retention参数用于事务commit后undo数据保留的时间。单位为秒。这是个no guarantee的限制。也就是,若空间足够,他只是个‘花瓶’;当可用空间不足而又有事务需要回滚空间,则这些数据依然会被覆盖。这个行为可能会导致ORA-01555错误,这些数据被记忆的时间可用v$undostat里面的字段TUNED_UNDORETENTION来查询。
很多时候,我们希望undo数据能够被留存,而不是被覆盖。那么在10g,oracle对undo增加了guarantee控制,也就是,用户可以指定undo表空间必须满足undo_retention的限制。
alter tablespace undotbs1 retention guarantee|noguarantee;
通过设置期望的保留时间,修改undo表空间属性,就可以使undo表空间运行在guarantee模式。下面我们用一个实验体验一下,noguarantee和guarantee有什么区别:
sys@ORCL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name like '%UNDOTBS%';
TABLESPACE_NAME CONTENTS RETENTION
------------------------------ --------- -----------
UNDOTBS1 UNDO NOGUARANTEE
sys@ORCL> alter system set undo_retention=800;
System altered.
sys@ORCL> alter tablespace undotbs1 retention guarantee;
Tablespace altered.
sys@ORCL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name like '%UNDOTBS%';
TABLESPACE_NAME CONTENTS RETENTION
------------------------------ --------- -----------
UNDOTBS1 UNDO GUARANTEE
将undo表空间自动扩展属性取消
sys@ORCL> select file_name,tablespace_name,bytes/1024/1024 m from dba_data_files where tablespace_name like '%UNDOTBS%';
FILE_NAME TABLESPACE_NAME M
------------------------------------------------------------------------ ------------------------------ ----------
/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8050fkc6_.dbf UNDOTBS1 30
sys@ORCL> alter database datafile '/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8050fkc6_.dbf' autoextend off;
Database altered.
尝试循环小批量删除数据,在guarantee设置下,很快会出现ORA-30036错误:
hr@ORCL> select count(*) from t;
COUNT(*)
----------
1462140
hr@ORCL> begin
2 for i in 1..1000
3 loop
4 delete from t where rownum<1001;
5 commit;
6 end loop;
7 end;
7 /
begin
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'
ORA-06512: at line 4
hr@ORCL> select count(*) from t;
COUNT(*)
----------
14620000
而在修改了undo表空间retention属性后,删除可以顺利完成
hr@ORCL> begin
2 for i in 1..1000
3 loop
4 delete from t where rownum<1001;
5 commit;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
undo_retention的设置可尽责于闪回功能。对于列的类型为LOB的,自动undo数据的记忆是不支持LOBs,必须设置undo_retention的值来尽力挽留之。oracle在undo segment header上创建一个retention table用于记录相关undo存储的提交时间,从而实现其保留策略。
最优的undo_retention如何计算?
模糊计算可以借助:
如果你的事务隔离级别是 serializable或read only ,你可以让undo_retention稍微长于最长运行的事务;
如果你的事务隔离级别是read commited,你可以让undo_retention稍微长于最长运行的语句(DML)。
精确计算可以借助公式:
我们需要选一段比较有代表性的时间段来测试,或者去多段,然后加权平均
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec)))"OPTIMAL UNDO RETENTION [Sec]"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
AND f.name = 'db_block_size'
ACTUAL UNDO SIZE [MByte] UNDO RETENTION [Sec] OPTIMAL UNDO RETENTION [Sec]
30 900 40421
分享到:
相关推荐
本文将围绕“达梦修改UNDO_RETENTION”这一主题,详细探讨这一设置对数据库性能的影响及其调整方法。 UNDO RETENTION参数在数据库中扮演着至关重要的角色,它定义了撤销段(UNDO SEGMENT)中数据保留的时间长度。...
解决 undo 段急剧增大问题的方法有多种,例如,调整 undo_retention 的时间,调整 undo 段的大小,使用 v$transaction 视图来查看事务执行的时间,使用 v$undostat 视图来确定事务的 undo 块的使用情况。 steal ...
### Oracle UNDO表空间管理详解 #### 一、概述 在Oracle数据库中,UNDO表空间扮演着极其重要的角色,特别是在事务处理与数据恢复方面。本文将深入浅出地介绍Oracle 10g/11g版本中的UNDO表空间管理机制。 #### 二...
Undo表空间由一系列的undo段组成,每个undo段又包含多个undo块。当事务开始时,系统会为事务分配一段undo空间来记录它的更改。当事务提交或回滚时,这些记录的undo信息会根据需要保留一定时间,这个时间段称为UNDO_...
Oracle数据库的Undo机制是其核心特性之一,它主要用于支持事务的回滚、读取一致性和闪回查询。本文将深入探讨Undo的详细功能及其优势。 首先,数据操纵语言(DML)包括INSERT、UPDATE、DELETE和MERGE等SQL语句,...
为了防止数据在undo_retention期间被覆盖,可以通过设置undo_tablespace的undo_retention参数来确保所需的Undo保留时间。 ORA-01555错误通常是因为Undo信息在需要时已被重用或删除,解决方法包括增加Undo表空间大小...
标题和描述均提到了“undo表...综上所述,undo表空间的管理和恢复是Oracle数据库管理员必须掌握的关键技能之一,它直接影响到数据的完整性和系统的稳定性。通过合理配置和及时维护,可以有效提升数据库的性能和可靠性。
在Oracle数据库系统中,"undo表空间"是一个至关重要的组成部分,它主要负责存储事务的回滚(rollback)信息。本文将深入探讨undo表空间的概念、作用、管理以及常见问题的处理,帮助你全面理解并有效地解决数据库undo...
因此,以下公式可用于计算佳 undo 表空间大小: 从 Oracle 10g 开始,您可以选择使用 GUARANTEE 选项,以确保在定义的 undo_retention 时间之前,undo 信息不会被覆盖。 UNDO表空间大小由三部
2. Oracle 10g 引入了自动 Undo 保留(Autotune Undo Retention),系统会根据需要自动调整 Undo 的保留时间。 3. Oracle 12c R1 引入了共享 Undo 模式(Shared Undo Mode),在多租户容器数据库(CDB)中,多个可...
### Oracle收缩Undo表空间 #### 一、概述 在Oracle数据库管理中,有时需要对Undo表空间进行管理和优化。特别是当Undo表空间因为历史数据积累而变得过大时,可能会影响数据库性能。本文将详细介绍如何通过新建一个...
本文将从DML语句与undo的关系入手,深入探讨undo在Oracle数据库中的作用及管理方式。 #### 二、DML语句与undo 在执行DML(数据操纵语言)语句时,Oracle数据库会自动记录更改前的数据,以便于在需要时进行恢复或...
- `UNDO_RETENTION`参数控制Undo数据保留的时间,以秒为单位。 **切换Undo表空间**: - 可以通过`ALTER SYSTEM SET UNDO_TABLESPACE = undotbs02;`命令切换到新的Undo表空间。 - 切换后,原有的Undo表空间中的事务...
- 设置UNDO表空间的公式大致为:Undo Size = Undo Retention * UPS,其中UPS是Undo Blocks per Second。可以通过查询`v$undostat`视图来获取UPS值。 2. **Redo Log Files** - Redo日志文件与UNDO表空间不同,它们...
- 设置`db_flashback_retention_target`参数来指定保留UNDO数据的时间长度。 - `UNDO_MANAGEMENT`必须设置为自动模式(AUTO)。 - `UNDO_RETENTION`设置合适的值以确保有足够的UNDO数据用于闪回。 ##### 2. 表闪回...
- **保证撤销保留**: 可以通过设置参数 `undo_retention` 来保证撤销数据的保留时间。 #### 使用撤销顾问 (Undo Advisor) - **撤销顾问**: 提供有关撤销数据使用情况的信息,帮助管理员了解撤销表空间的性能,并...
- **UNDO_RETENTION**: 这个参数决定了未提交事务的数据在UNDO表空间中保留的时间长度,以秒为单位。默认情况下,该值可能因系统而异,但通常为900秒(15分钟)或更长时间。这直接关系到误删数据后能否利用UNDO表空间...
- **选项E:UNDO_RETENTION参数的值**(The value of the UNDO_RETENTION parameter): UNDO_RETENTION参数决定了撤销数据在UNDO表空间中保留的时间长度。较高的值意味着需要更大的UNDO表空间以确保撤销数据可以在更...