ITPub博客

首页 > 数据库 > Oracle > UNDO段区间分配介绍

UNDO段区间分配介绍

Oracle 作者:kunlunzhiying 时间:2016-12-24 10:58:09 0 删除 编辑
以下信息整理于网络:
UNDO主要用于以下方面:
1.在执行rollback语句的时候rollback事物
2.恢复数据库
3.提供读一致性
4.为oracle flashback query提供支持
5.使用oracle flashback特性恢复数据库逻辑失败

一般来讲事物的undo信息存储在回滚段中,事物的undo信息一直存在,直到一个commit或者rollback语句执行。自动回滚段管理允许DBA指定oracle数据库保留多久的commit之后的undo信息。防止在长时间的查询产生ora-01555:snapshot too old.通过设置UNDO_RETENTION参数来达到这个目的,默认是900s(15min).可以设置这个参数保证数据库保留undo日志的时间.设置UNDO_MANAGEMENT = AUTO参数就可以设置自动管理回滚段特性。

undo段中的区有以下三种状态:
Unexpired Extents – Undo data whose age is less than the undo retention period.
Expired Extents – Undo data whose age is greater than the undo retention period.
Active Extents – Undo data that is part of the active transaction.
以下介绍oracle是怎么利用undo回滚段的:
第一步.当需要回滚段的时候,一个undo信息需要被写入到回滚段中。如果当前使用区已经不足,并且下一个区是expired状态,优先使用expired状态的区,而不是从空闲区间池中产生一个空闲的区间。
第二步.如果第一步由于没有可用的区间而失败,并且undo数据文件不是自动扩展的。则oracle试图去利用另一个回滚段的expired状态区间。
第三步.如果第二步由于其他回滚段没有expired状态的区间,则oracle试图去利用当前回滚段的unexpired区间
第四步.如果第三步仍然失败,则oracle视图利用另一个回滚段的unexpired状态区间
第五步.如果以上全部失败,则an Out-Of-Space error 就会产生。
以下实验:
SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;

TABLESPACE_NAME                STATUS            GB
------------------------------ --------- ----------
UNDOTBS1                       UNEXPIRED .010742188
UNDOTBS1                       EXPIRED   .015014648

SQL> update t1 set name='eeeee' where id=5;

SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;

TABLESPACE_NAME                STATUS            GB
------------------------------ --------- ----------
UNDOTBS1                       UNEXPIRED .009765625
UNDOTBS1                       EXPIRED   .015014648
UNDOTBS1                       ACTIVE    .000976563

Undo Blocks per Second

?
1
2
3
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
      "UNDO_BLOCK_PER_SEC"
  FROM v$undostat;

Optimal Undo Retention

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
209'715'200 / (3.12166667 * 4'096) = 16'401 [Sec]
 
Using Inline Views, you can do all in one query!
 
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'

Calculate Needed UNDO Size for given Database Activity

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
       SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
       (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
       g.undo_block_per_sec) / (1024*1024)
      "NEEDED UNDO SIZE [MByte]"
  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'

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28211342/viewspace-2131309/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle搬砖侠,略懂MySQL 、MongoDB运维,积极向自动化,智能化、平台化运运维方向努力。

注册时间:2014-07-28

  • 博文量
    666
  • 访问量
    264452