(9i以前称为Rollback segment;9i称为Undo segment/Undo Tablespace;10g及以后只有Undo Tablespace.)
一、UNDO数据的作用.
1、回退事务
当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变化.假定用户A执行了语句UPDATE emp SET sal=1000 WHERE empno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中.
2、读一致性
用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保数据的一致性.例如,当用户A执行语句UPDATE emp SET sal=1000 WHERE empno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的.
3、事务恢复
事务恢复是例程恢复的一部分,它是由oracle server自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracle server时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务.
4、倒叙查询(FlashBack Query)
倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改并提交了事务(雇员原工资为3000),为了取得10:00之前的雇员工资,用户可以使用倒叙查询特征.
二、相关的Configuration Parameter:
1、UNDO_MANAGEMENT:值:Auto/Manual。指定UNDO数据的管理方式。在9I中默认设为AUTO。此参数不可动态调整。
2、UNDO_TABLESPACE:指定表空间的名称。如果没有指定表空间的名字,ORACLE会自动找一个默认的表空间。
3、UNDO_SUPPRESS_ERRORS:值:True/False。值为True的情况下,在UNDO_MANAGEMENT节= TRUE时,如果手动对UNDO进行修改,将会报错。错误如下:
ORA-30019: Illegal rollback Segment operation in Automatic Undo mode.
4、UNDO_RETENTION:设定UNDO data的最大保留时间。默认为900秒。
三、Sizing Undo Tablespace:
Undospace = [UR * (UPS * DBS)] + (DBS * 24)
UR: UNDO_RETENTION in seconds.
UPS: Number of undo data blocks generated per second.
To get this value:
select (sum(undoblks)/sum(((endtime - starttime)*86400))) from v$undostat;
DBS: the size of DB_BLOCK_SIZE.
四、To obtain undo segment information.
1、Data Dictionary View: DBA_ROLLBACK_SEGS
2、Dynamic Parameter Views:
(1) V$ROLLNAME
(2) V$ROLLSTAT v$rollname.USN = v$rollstat.USN
(3) V$UNDOSTAT
(4) V$SESSION
(5) V$TRANSACTION v$session.SADDR = v$transaction.SES_ADDR
--=============================
--占用回滚段
SELECT (select sa.module from v$sqlarea sa where sa.SQL_ID = s.SQL_ID) module, --RXGLVCJ ,CUXCAHST
TO_CHAR(s.sid)||','||TO_CHAR(s.serial#) sid_serial,
NVL(s.username, 'None') orauser,
s.program,
r.name undoseg,
t.used_ublk * TO_NUMBER(x.value)/1024||'K' "Undo"
FROM sys.v_$rollname r,
sys.v_$session s,
sys.v_$transaction t,
sys.v_$parameter x
WHERE 1=1
AND s.taddr = t.addr
AND r.usn = t.xidusn(+)
AND x.name = 'db_block_size';
一、UNDO数据的作用.
1、回退事务
当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变化.假定用户A执行了语句UPDATE emp SET sal=1000 WHERE empno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中.
2、读一致性
用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保数据的一致性.例如,当用户A执行语句UPDATE emp SET sal=1000 WHERE empno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的.
3、事务恢复
事务恢复是例程恢复的一部分,它是由oracle server自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracle server时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务.
4、倒叙查询(FlashBack Query)
倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改并提交了事务(雇员原工资为3000),为了取得10:00之前的雇员工资,用户可以使用倒叙查询特征.
二、相关的Configuration Parameter:
1、UNDO_MANAGEMENT:值:Auto/Manual。指定UNDO数据的管理方式。在9I中默认设为AUTO。此参数不可动态调整。
2、UNDO_TABLESPACE:指定表空间的名称。如果没有指定表空间的名字,ORACLE会自动找一个默认的表空间。
3、UNDO_SUPPRESS_ERRORS:值:True/False。值为True的情况下,在UNDO_MANAGEMENT节= TRUE时,如果手动对UNDO进行修改,将会报错。错误如下:
ORA-30019: Illegal rollback Segment operation in Automatic Undo mode.
4、UNDO_RETENTION:设定UNDO data的最大保留时间。默认为900秒。
三、Sizing Undo Tablespace:
Undospace = [UR * (UPS * DBS)] + (DBS * 24)
UR: UNDO_RETENTION in seconds.
UPS: Number of undo data blocks generated per second.
To get this value:
select (sum(undoblks)/sum(((endtime - starttime)*86400))) from v$undostat;
DBS: the size of DB_BLOCK_SIZE.
四、To obtain undo segment information.
1、Data Dictionary View: DBA_ROLLBACK_SEGS
2、Dynamic Parameter Views:
(1) V$ROLLNAME
(2) V$ROLLSTAT v$rollname.USN = v$rollstat.USN
(3) V$UNDOSTAT
(4) V$SESSION
(5) V$TRANSACTION v$session.SADDR = v$transaction.SES_ADDR
--=============================
--占用回滚段
SELECT (select sa.module from v$sqlarea sa where sa.SQL_ID = s.SQL_ID) module, --RXGLVCJ ,CUXCAHST
TO_CHAR(s.sid)||','||TO_CHAR(s.serial#) sid_serial,
NVL(s.username, 'None') orauser,
s.program,
r.name undoseg,
t.used_ublk * TO_NUMBER(x.value)/1024||'K' "Undo"
FROM sys.v_$rollname r,
sys.v_$session s,
sys.v_$transaction t,
sys.v_$parameter x
WHERE 1=1
AND s.taddr = t.addr
AND r.usn = t.xidusn(+)
AND x.name = 'db_block_size';