UNDO表空间的估算

UNDO表空间和TEMP空间类似,都是循环使用的,其使用原理大致如下:

当我们使用AUM(自动UNDO管理),并设置了undo_retention以后,undo块就存在四种状态。

Active:表示正在使用该undo的事务还没有提交或回滚。

Inactive:表示该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。

Expired:表示该undo持续inactive的时间超过undo_retention所指定的时间。

Freed:表示该undo块内容是空的,从来没有被使用过。

当活动的事务使用undo segment时,在AUM模式下,事务可以在不同的undo segment之间动态交换undo空间,也就是在不同的undo segment里交换extents。当一个正在执行的事务需要更多的undo空间时,首先会重用当前undo segment里的可用空间;如果当前undo segment里的可用空间(也就是extents)不足时,则会按照下面的步聚获得所需要的extent:

获取undo表空间里可用的、空的extents;

获取其他undo segment里的expired状态的extents;

如果undo表空间里的数据文件启用了自动扩展(autoextend on),则数据文件进行自动扩展;

如果undo表空间里的数据文件没有启用自动扩展,则获取其他undo segment里的INACTIVE状态的extents;

如果以上步骤均无法获得可用空间时,报空间不足的错误消息。

这种动态的方式使得空间的使用最为高效。我们来举例说明,如图7-2所示。

 
图7-2  undo获取可用空间的机制

在图7-2中,假设undo表空间中总共存在5个undo segment(US1、US2、US3、US4和US5)。每个undo segment中包含7个extent,其中每个extent的状态采用A、I、X和F来表示。那么当使用US5的事务还需要额外的可用空间时,首先会使用US5中两个状态为F的extents;如果不够用,则使用US4中的3个状态为F的extents;如果还不够用,则使用US3中的3个状态为X的extents;如果仍然不够用,则使用US1中的3个状态为I的extents;如果再不够用,则报空间不足的错误消息。

对于UNDO空间多大合适,有一个计算方法:

每秒平均(或最大)产生的UNDO数据块的数量*块尺寸*UNDO数据保存的最短时间(或最长的SQL运行时间)

其中“每秒平均(或最大)产生的UNDO数据块的数量”可以通过v$undostat字典视图来计算,计算方法如下:

每秒平均产生的UNDO数据块的数量

SELECT (SUM(undoblks))/ SUM((end_time - begin_time) * 86400) FROM v$undostat;

每秒最大产生的UNDO数据块的数量

SELECT max(undoblks / ((end_time - begin_time) * 24 * 3600)) FROM v$undostat;

其中“块尺寸”可以通过系统参数db_block_size查询得知(一般默认为8192)。

show parameter db_block_size

其中“UNDO数据保存的最短时间”可以通过系统参数undo_retention查询得知 (默认为900秒)

show parameter undo_retention

而“最长的SQL运行时间”可以通过以下方法确定:

SELECT max(SUM(elapsed_seconds)) FROM v$session_longops GROUP BY sid,serial#,sql_id

将以上得出的数字代入公式,就可以计算出UNDO所需空间的大小了。

例如,我们得出

每秒平均产生的UNDO数据块数量为100,每秒最大产生的UNDO数据块的数量为200;

块尺寸为8192;

undo数据保存的最短时间为900秒,最长的SQL运行时间为2400秒。

则以“每秒平均产生的UNDO数据块的数量*块尺寸*UNDO数据保存的最短时间”来计算,得出

100块/秒*8192字节/块*900秒=737280000字节,约等于703M。

若以“每秒最大产生的UNDO数据块的数量*块尺寸*最长的SQL运行时间”来计算,得出

200块/秒*8192字节/块*2400秒=3932160000字节,约等于3750M。

因此,若将UNDO空间大小设置为703M,则可以基本保证在900秒前发生的改变,是可以查到的,或者说,在对于一个运行时间不超过900秒的SQL语句来说,是不太会遭遇“ORA-01555 快照过旧”这种错误的。

而若将UNDO空间大小设置为3750M,则可以基本保证在2400秒(样例系统中可以查到的SQL最长运行时间)前发生的改变,是可以查到的,或者说,在对于一个运行时间不超过2400秒的SQL语句来说,是不太会遭遇“ORA-01555 快照过旧”这种错误的。

参考:

http://book.51cto.com/art/200806/75648.htm

UNDO表空间的估算,布布扣,bubuko.com

时间: 2024-10-13 11:53:17

UNDO表空间的估算的相关文章

监控和管理Oracle UNDO表空间的使用

监控和管理Oracle UNDO表空间的使用 对Oracle数据库UNDO表空间的监控和管理是我们日常最重要的工作之一,UNDO表空间通常都是Oracle自动化管理(通过undo_management初始化参数确定):UNDO表空间是用于存储DML操作的前镜像数据,它是实例恢复,数据回滚,一致性查询功能的重要组件:我们常常会忽略对它的监控,这会导致UNDO表空间可能出现以下问题: 1).空间使用率100%,导致DML操作无法进行. 2).告警日志中出现大量的ORA-01555告警错误. 3).实

记一次ORACLE的UNDO表空间爆满分析过程

这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了. DB Tablespace Allocated Free Used % Free % Used 192.168.xxx.xxx:1521 UNDOTBS1 16384 190.25 16193.75 1.16 99 使用一

Oracle undo 表空间不可用

由于某次不小心操作,在切换表空间时没有成功,但是由于把parameter undo的undo_management值改为了MANUAL所以在启动数据库时没有报任何错误,但是给表插入数据时报错了,回滚段不可用的错误.然后查询了错误原因. 1 首先看数据库中undo信息 SQL> show parameter undo; NAME TYPE VALUE------------------------------------ ----------- --------------------------

第15章 oracle undo表空间管理

2015-10-23 目录 参考资料 [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013 [2] Oracle undo 表空间管理 [3] undo表空间概述 [4] Oracle UNDO表空间的管理 [5] Oracle的UNDO表空间管理总结 [6] UNDO表空间的管理 [7] UNDO表空间的管理 [8] 监控和管理Oracle UNDO表空间的使用 [9] 谈谈undo表空间

undo表空间概述

oracle028 undo表空间概述 UNDO的简要概序: 1. 一般的表空间中的段是手动建立的,undo表空间和普通的表空间相似,但是undo表空间中undo段,undo段是自动生成的:oracle自动使用.维护undo段. 2. 一般表空间中的段是我们自己手动使用的,而undo表中的段是oracle自动使用的. show parameter undo_tablespace;//查询当前的undo表空间 NAME                                        

在线扩大数据库UNDO表空间

用oracle账号登陆ORACLE数据库服务器 方法一: 查看表空间的名字及文件所在位置: select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 修改数据库datafile文件到新的大小 alter database datafile '\oracle\oradata\undotab1.dbf'

MySQL5.7新特性——在线收缩undo表空间

1. MySQL 5.5时代的undo log 在MySQL5.5以及之前,大家会发现随着数据库上线时间越来越长,ibdata1文件(即InnoDB的共享表空间,或者系统表空间)会越来越大,这会造成2个比较明显的问题: (1)磁盘剩余空间越来越小,到后期往往要加磁盘: (2)物理备份时间越来越长,备份文件也越来越大. 这是怎么回事呢? 原因除了数据量自然增长之外,在MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的.一旦出现大事务,这个大事务所使用的undo

【undo表空间的丢失-恢复-1】

使用rman进行恢复--undo丢失 restore 把文件还原回去: recover 利用日志文件重做: 关键性的文件丢失和非关键性的文件丢失(system/undo之外的丢失) 1> 删除undo文件: [[email protected] ~]$ rm /u01/oracle/oradata/jadl10g/undotbs01.dbf [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Prod

UNDO表空间损坏导致数据库无法OPEN

在数据库undo表空间文件损坏,或者undo表空间文件缺失的情况下,无法打开数据库. 这两种情况都可以视为一种情况处理,解决方法一样. 场景:在23:10的时候新建一个undo表空间undotbs02,并切换至该undo表空间. 此时再闪回数据库至23:10. 由于闪回数据库时使用的是undotbs02,而23:10时使用的是undotbs01, 会造成undo表空间缺失,无法打开数据库.(注:闪回数据库之后需要resetlogs) 从上面的错误就可以看出来,此时undotbs02不存在,无法打