LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

oracle数据库逻辑结构(4)

时间:2012-07-01 18:53来源:未知 编辑:admin 点击:
(3) 回退段 回退段用于存储用户数据修改之前的值,因而可以在特定条件下回退数据。回退段与事务是一对多的关系,一个事务只能使用一个回退段,而


(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

------分隔线----------------------------
标签:逻辑结构Oracle
栏目列表
推荐内容