在之前的文章里有对undo segment 有说明:
SQL> col segment_name format a10
SQL>
SEGMENT_NATABLESPACE_NAME BYTES NEXT_EXTENT
---------- ---------------------------------------- -----------
SYSTEM SYSTEM 393216 1048576
通过上面的这条语句,我们查到了这个用于rollback 的system segment 存在与system 表空间。 默认情况下,只有一个segment,并且它还比较小,所以,如果使用system 段来存储undo records。肯定会影响数据库的性能。 所以Oracle 是建议使用Undo tablespace 来管理undo records。
SYS@anqing2(rac2)>
SEGMENT_NAME TABLESPACE_NAME HEADER_FILEHEADER_BLOCK BYTES
--------------- --------------- ----------------------- ----------
_SYSSMU1$ UNDOTBS1 2 9 107806720
_SYSSMU2$ UNDOTBS1 2 25 111411200
_SYSSMU3$ UNDOTBS1 2 41 120586240
_SYSSMU4$ UNDOTBS1 2 57 100990976
_SYSSMU5$ UNDOTBS1 2 73 112721920
_SYSSMU6$ UNDOTBS1 2 89 117243904
_SYSSMU7$ UNDOTBS1 2 105 106233856
_SYSSMU8$ UNDOTBS1 2 121 155975680
_SYSSMU9$ UNDOTBS1 2 137 184287232
_SYSSMU10$ UNDOTBS1 2 153 149356544
_SYSSMU11$ UNDOTBS2 5 9 131072
SEGMENT_NAME TABLESPACE_NAME HEADER_FILEHEADER_BLOCK BYTES
--------------- --------------- ----------------------- ----------
_SYSSMU12$ UNDOTBS2 5 25 131072
_SYSSMU13$ UNDOTBS2 5 41 131072
_SYSSMU14$ UNDOTBS2 5 57 131072
_SYSSMU15$ UNDOTBS2 5 73 131072
_SYSSMU16$ UNDOTBS2 5 89 131072
_SYSSMU17$ UNDOTBS2 5 105 131072
_SYSSMU18$ UNDOTBS2 5 121 131072
_SYSSMU19$ UNDOTBS2 5 137 131072
_SYSSMU20$ UNDOTBS2 5 153 131072
20 rows selected.
通过以上SQL的查询结果,我们可以看出,每个节点有10个undo segment来存放undo records。
以上我们是通过dba_segment 表查看的结果。 也可以通过v$rollstat和v$rollname 两个视图来查看信息。 这2个视图会显示所有rollback 段的信息。 包括system段和undo段。
SQL> col name format a15
SQL>
USNNAME EXTENTS HWMSIZESTATUS
---------- --------------- -------------------- ---------------
0SYSTEM 6 385024ONLINE
1_SYSSMU1$ 3 7659520ONLINE
2_SYSSMU2$ 3 9691136ONLINE
3_SYSSMU3$ 4 7462912ONLINE
4_SYSSMU4$ 3 76668928ONLINE
5_SYSSMU5$ 4 8511488ONLINE
6_SYSSMU6$ 3 7462912ONLINE
7_SYSSMU7$ 3 33480704ONLINE
8_SYSSMU8$ 3 8577024ONLINE
9_SYSSMU9$ 3 7462912ONLINE
10_SYSSMU10$ 3 13754368ONLINE
11 rows selected.
可以通过v$transaction 视图来确认事务当前使用的undo segment信息。 确定undo segment之后,就可以进行相关的dump 操作。 关于v$transaction 视图的说明,参考官方文档: http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/dynviews_3114.htm#REFRN30291
部分说明如下:
ADDR
RAW(4 | 8)
Address of the transaction state object
XIDUSN
NUMBER
Undo segment number
XIDSLOT
NUMBER
Slot number
XIDSQN
NUMBER
Sequence number
UBAFIL
NUMBER
Undo block address (UBA) filenum
UBABLK
NUMBER
UBA block number
UBASQN
NUMBER
UBA sequence number
UBAREC
NUMBER
UBA record number
STATUS
VARCHAR2(16)
Status
SYS@anqing2(rac2)> select sid fromv$mystat where rownum=1;
SID
----------
147
SYS@anqing2(rac2)> update ta set name='dave'where name='ora_rowscn';
474 rows updated.
SYS@anqing2(rac2)> selectxidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC
---------- ---------- ---------- -------------------- ----------
11 23 1010 12 5 9
--xidusn:undo segment number
--xidslot:slot number
--xidsqn:sequence number
--ubafil:undo block address (uba) filenum
--ubablk:uba block number
--ubarec:UBA record number
关于UBA的这部分内容, 在我有关itl 的那篇文章里有说明:Orace ITL(InterestedTransaction List) 说明
SYS@anqing2(rac2)> select usn,name from v$rollname where usn=11;
USN NAME
----------------------------------------
11 _SYSSMU11$
SYS@anqing2(rac2)> commit;
Commit complete.
SYS@anqing2(rac2)> selectxidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
no rows selected
SYS@anqing2(rac2)>