红尘浪子 2012-08-01
在之前的文章里有对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
--通过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)>