一. undo 的一些准备知识
在之前的文章里有对undo segment 有说明:
1.1 当undo_management被设置成MENUAL时使用系统回滚段, 即将undo records 记录到SYSTEM 表空间下的SYSTEM段。
SQL> col segment_name format a10
SQL> select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';
SEGMENT_NATABLESPACE_NAME BYTES NEXT_EXTENT
---------- ---------------------------------------- -----------
SYSTEM SYSTEM 393216 1048576
通过上面的这条语句,我们查到了这个用于rollback 的system segment 存在与system 表空间。 默认情况下,只有一个segment,并且它还比较小,所以,如果使用system 段来存储undo records。肯定会影响数据库的性能。 所以Oracle 是建议使用Undo tablespace 来管理undo records。
1.2 当undo_management设置成AUTO时使用UNDOtablespace来管理回滚段。 这个时候,我们将有多个undo segment,并且这些segment 是存放在UNDO 表空间里的。 这样对DB的性能就会提高。
SYS@anqing2(rac2)> select segment_name,tablespace_name, header_file, header_block,bytes from dba_segments where segment_type='TYPE2 UNDO';
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> select s.usn,n.name,s.extents,s.hwmsize,s.status from v$rollstat s, v$rollname n wheres.usn=n.usn;
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.
1.3 查看事务当前使用的undo segment
可以通过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
--查看当前的SID信息
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.
--查看v$transaction中正在使用的回滚段号
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的格式为:DBA.seq#.rec#,关于UBA的这部分内容, 在我有关itl 的那篇文章里有说明:Orace ITL(InterestedTransaction List) 说明 http://www.linuxidc.com/Linux/2011-08/40284.htm
--通过xidusn号和v$rollname确定正在使用的undo segment name
SYS@anqing2(rac2)> select usn,name from v$rollname where usn=11;
USN NAME
----------------------------------------
11 _SYSSMU11$
--commit之后,对应的事务信息就没有了。
SYS@anqing2(rac2)> commit;
Commit complete.
SYS@anqing2(rac2)> selectxidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
no rows selected
SYS@anqing2(rac2)>