(3) 回退段 回退段用于存储用户数据修改之前的值,因而可以在特定条件下回退数据。回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。当一个事务开始处理时,系统为之分配回滚段存储回滚信息,当所有回滚段都已被事务所占用是,系统将创建出新的回滚段来存储新事物的回滚信息,当表空间中无空间可用于分配新的回滚段时,多个事务将共同一个回滚段。 Oracle 9i之后,oracle增加了undo表空间,由系统自动管理。故可不再需要考虑对回滚段的管理,在系统自动管理模式下,oracle会自动完成回滚段的创建、删除以及online/offline,DBA不能干预这些操作。 SQL> select segment_id,segment_name from dba_rollback_segs; 查询undo表空间中的回退段 SQL> select a.name,b.xacts,b.writes,b.extents,b.wraps from v$rollname a, v$rollstat b where a.usn=b.usn; 查每个回退段名称,每个段当前所包含活动事务数,启动后每个段上所有活动事务在该段上所占字节数,每个段的大小(extent的个数)及启动后的wraps(翻转)次数。 SQL> select segment_name,extent_id,bytes,status from dba_undo_extents; 查回退段是extent分配详情及状态: active:有活动事务在此extent上 unexpired:已结束事务,undo信息未达到undo_retention时间限制 expired:已结束事务,undo信息超过undo_retention时间限制 $sqlplus / as sysdba SQL> create table kitty.t1 as select * from dba_objects; $sqlplus kitty/123456 SQL> insert into t1 select * from t1; SQL>conn sys/redhat as sysdba SQL> select a.username,b.name,c.used_ublk from v$session a,v$rollname b,v$transaction c where a.saddr=c.ses_addr and b.usn=c.xidusn; USERNAME NAME USED_UBLK ------------------------------ ------------------------------ ---------- KITTY _SYSSMU6$ 202 KITTY _SYSSMU10$ 2 查DB中所有活动(未提交或回退)事务所占用的回退段情况 事务将以顺序循环的方式使用回滚段的区,在当前区用满后就使用下一个区,几个事务可以使用回滚段的同一个区,但每个回滚段的块只能包含一个事务的信息。 例如(两个事务使用同一个回滚段,该回滚段有四个区): 1. 事务在进行中,它们正在使用回滚段的第三个区; 2. 当两个事务产生更多的回滚信息,它们将继续使用第三个区; 3. 当第三个区满后,事务将写到第四个区,当事务开始写到一个新的区时,称为wrap 4. 当第四个区用满时,若第一个区是空闲或非活动的,即该区中所有事务均已完成,没有未提交或提交或回退事务,则事务将循环再使用第一个区。 回滚段的扩张(extend) 在当前的所有块用完而事务还需要更多的回滚空间是,将使用回滚段的下一个区,当最后一个区用完,将循环重新使用第一个区。 回滚段使用下一个区的前提是下一个区没有活动事务,若下一个区正在使用即存在活动事务时,事务将未回滚段分配一个新的区,插入到当前区和下一个区之间,这种分配称为回滚段的扩展。回滚段将一直扩展到区的个数到达回滚段的参数maxextents的值时为止。 SQL> select segment_name,owner,status from dba_rollback_segs; 查询数据库自动管理回退信息时在undo表空间中使用的回退段 $sqlplus / as sysdba SQL> create table a as select * from dba_objects; SQL> create table b as select * from dba_objects; SQL> delete from a; SQL> select distinct sid from v$mystat; SID ---------- 145 建两个测试表,发起一个delete操作消耗回滚段空间,并查找任务号 $sqlplus / as sysdba SQL> update b set object_id=0; SQL> select distinct sid from v$mystat; SID ---------- 148 另开一会话并发起另一update操作消耗回滚段空间,并查找任务号 SQL>select r.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.used_ ublk,t.noundo,substr(s.program,1,40) from sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r where t.addr=s.taddr and t.xidusn=r.usn and s.sid=145; NAME SERIAL# SID USERNAME STATUS CR_GET PHY_IO USED_UBLK NOU ------------------------------ ---------- ---------- ------------------------------ ---------------- ---------- ---------- ---------- --- SUBSTR(S.PROGRAM,1,40) -------------------------------------------------------------------------------- _SYSSMU7$ 20 145 SYS ACTIVE 836 330 1455 NO sqlplus@station31.example.com (TNS V1-V3 SQL>select r.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.used_ ublk,t.noundo,substr(s.program,1,40) from sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r where t.addr=s.taddr and t.xidusn=r.usn and s.sid=148; NAME SERIAL# SID USERNAME STATUS CR_GET PHY_IO USED_UBLK NOU ------------------------------ ---------- ---------- ------------------------------ ---------------- ---------- ---------- ---------- --- SUBSTR(S.PROGRAM,1,40) -------------------------------------------------------------------------------- _SYSSMU3$ 2 148 SYS ACTIVE 2181 308 1022 NO sqlplus@station31.example.com (TNS V1-V3 查看delete和update操作分别消耗量哪个回滚段多少空间 回滚段的回缩(shrink) undo表空间被系统自动重复使用,当有大事务发生时,系统将自动扩充undo表空间,但不会自动回缩,故需手工回缩undo表空间 SQL> create undo tablespace undotbs02 datafile '/u01/app/oracle/oradata /ora10/undotbs02.dbf' size 100M; 新建回滚表空间 SQL> alter system set undo_tablespace=undotbs02; 设置新的回滚表空间 SQL> show parameter undo_tablespace; 查询当前使用的undo表空间名 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTBS02 SQL> select segment_name,owner,status from dba_rollback_segs; 查询数据库自动管理回退信息时在undo表空间中使用的回退段。可见原测试所占回滚段仍online,提交或回滚测试语句不久后将offline (4) 临时段 是oracle在运行过程中自行创建的段,当一个sql语句需要临时工作区时,由oracle建立临时段,一旦语句执行完毕,临时段的区间便退回给系统 临时段用于order by语句的排序以及一些汇总 $sqlplus kitty/123456 SQL> select a.table_name,b.table_name from dict a,dict b order by a.table_name; $sqlplus / as sysdba SQL> select segment_file,total_extents,total_blocks,used_extents used_blocks, free_extents,free_blocks from v$sort_segment; SEGMENT_FILE TOTAL_EXTENTS TOTAL_BLOCKS USED_BLOCKS FREE_EXTENTS FREE_BLOCKS ------------ ------------- ------------ ----------- ------------ ----------- 0 22 2816 20 2 256 查临时表空间中每个临时段(文件)的总区/块数,已用区/块数及空间区/块数。 SSQL> select username,segfile#,extents,blocks from v$sort_usage; USERNAME SEGFILE# EXTENTS BLOCKS ------------------------------ ---------- ---------- ---------- KITTY 201 20 2560 查当前使用临时表空间中临时段(文件)的用户,及所占区/块数。 SQL> create temporary tablespace temp2 tempfile '/u01/temp2.dat' size 10M; 创建临时表空间及其大小 SQL> alter database default temporary tablespace temp2; 设置默认使用的临时表空间 转载请保留固定链接: https://linuxeye.com/database/666.html |