我们都知道,Oracle在进行dml过程中,有重要的一步,即创建undo和redo。redo用于事务重演,而undo用于事务的回退。
创建undo,记录data block的前映像,需要在undo tablespace 中分配undo segment,来记录undo record。
最近一个oracle群里遇到一个事务引起undo tablespace的一个undo segment暴涨的情况,群里也进行了讨论,其中有Q友发出了oracle doc中关于dml事务
对undo segment 的分配和使用情况,如下:
。
群里讨论最后,我也来测试下这个过程及结论。
(1):准备工作
--创建一个新的undo tablespace,大小640k,数据文件禁止自动扩展,用于替换原来的undo tablespace.--之前已经测试过一个初始的undo segment 大小为:128*1024=128k,这里指定这个数据文件大小:128k*5 = 640k
create undo tablespace undotbs5 DATAFILE 'E:/oradata/undotbs5.dbf' SIZE 640k reuse autoextend off;--切换回滚段: alter system set undo_tablespace=undotbs5 scope=both;--把原来的undo 表空间离线,并删除(这里必须是原来的undo segment都要offline,才能删除undo tablespace)
altertablespace undotbs1 offline;drop tablespace undotbs1 including contents and datafiles;
(2):创建事务操作的测试表
create tabletest(
idnumber,
namevarchar2(20));begin
for i in 1..20loopinsert into test(id,name) values(i,'sina' ||i);endloop;commit;end;/
(3):查看目前undo tablespace的表空间及数据文件
--查看undo 表空间
col tablespace_name fora20
col statusfora10set lines 200
select tablespace_name,block_size,min_extents,max_extents,status,contents,extent_management,allocation_type from dba_tablespaces where contents='UNDO';
TABLESPACE_NAME BLOCK_SIZE MIN_EXTENTS MAX_EXTENTS STATUS CONTENTS EXTENT_MANAGEMENT ALLOCATION_TYPE-------------------- ---------- ----------- ----------- ---------- ------------------ -------------------- ------------------
UNDOTBS5 8192 1 2147483645ONLINE UNDO LOCAL SYSTEM--查看undo segment