undo Segment深入解析(2)

3、如果下一个extent没有expired,则从undo tablespace中分配空间。如果有剩余空间则使用新分配extent的第一个数据块。此时undo tablespace的使用率开始增加。

4、如果没有剩余空闲的extent,则从offline状态的回滚段中偷取(steal)过期的extent,加入当前回滚段,并使用第一个数据块。

5、如果offline状态的回滚段中没有expired extent,则从online状态的回滚段中偷取(steal)过期区加入到当前的回滚段中,并使用extent中的第一个数据块。

6、如果undo tablespace可以扩展,则扩展undo tablespace,并将新extent加入到当前的回滚段中,同时使用第一个数据块,此时undo所占的操作系统空间开始增加。

7、如果undo tablespace 不能扩展,则自动调整(下降幅度为10%)回滚段的保留时间,然后偷取在更短保留时间下的未过期的extent,如果还未找到过期的extent,则继续以10%的速度减少回滚段的保留时间,重复几次。

8、随机从其他offline状态的回滚段中偷取未过期(unexpired)的extent。

9、尝试使用当前回滚段中未过期的extent,如果所有的区都为ACTIVE状态,则进入下一步。

10、如果以上所有的尝试都失败,则报ORA-30036的错误。

[oracle@rh6 ~]$ oerr ora 30036

30036, 00000, "unable to extend segment by %s in undo tablespace '%s'"

// *Cause:  the specified undo tablespace has no more space available.

// *Action:  Add more space to the undo tablespace before retrying

//          the operation. An alternative is to wait until active

//          transactions to commit.

案例: 

10:34:45 SYS@ prod>select tablespace_name,contents from dba_tablespaces;

TABLESPACE_NAME                CONTENTS

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

SYSTEM                        PERMANENT

SYSAUX                        PERMANENT

TEMP                          TEMPORARY

USERS                          PERMANENT

UNDOTBS2                      UNDO

EXAMPLE                        PERMANENT

TBS1                          PERMANENT

7 rows selected.

Elapsed: 00:00:00.03

10:34:56 SYS@ prod>create undo tablespace undotbs1

10:35:15  2  datafile '/u01/app/oracle/oradata/prod/undotbs1.dbf' size 1m;

Tablespace created.

Elapsed: 00:00:01.38

10:35:40 SYS@ prod>show parameter undo

NAME                                TYPE        VALUE

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

undo_management                      string      AUTO

undo_retention                      integer    900

undo_tablespace                      string      UNDOTBS2

10:35:49 SYS@ prod>alter system set undo_tablespace=undotbs1;

System altered. 

Elapsed: 00:00:00.13

10:36:03 SYS@ prod> 

10:36:03 SYS@ prod>select s.sid,s.serial#,s.username,u.segment_name,count(u.extent_id) "Extent count",

10:37:37  2  t.used_ublk,t.used_urec,s.program

10:38:00  3  from v$session s,v$transaction t,dba_undo_extents u

10:38:24  4  where s.taddr=t.addr and u.segment_name like '_SYSSMU'||t.xidusn||'_%$' and u.status='ACTIVE'

10:39:50  5  GROUP BY s.sid,s.serial#,s.username,u.segment_name,t.used_ublk,t.used_urec,s.program

10:40:37  6  order by t.used_ublk desc,t.used_urec desc,s.sid,s.serial#,s.username,s.program;

开启新的session,执行DML:

10:41:45 SYS@ prod>conn scott/tiger

Connected.

10:42:45 SCOTT@ prod>insert into t1 select * from t1 where rownum <1000;

999 rows created.

查看undo tablespace 使用情况:

10:43:29 SYS@ prod> select s.sid,s.serial#,s.username,u.segment_name,count(u.extent_id) "Extent count",

2  t.used_ublk,t.used_urec,s.program

3  from v$session s,v$transaction t,dba_undo_extents u

4  where s.taddr=t.addr and u.segment_name like '_SYSSMU'||t.xidusn||'_%$' and u.status='ACTIVE'

5  GROUP BY s.sid,s.serial#,s.username,u.segment_name,t.used_ublk,t.used_urec,s.program

6* order by t.used_ublk desc,t.used_urec desc,s.sid,s.serial#,s.username,s.program

SID    SERIAL# USERNAME  SEGMENT_NAME        Extent count  USED_UBLK  USED_UREC PROGRAM

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/71cb0f68a3e39a60763b57918885faa9.html