日期:2014-05-16  浏览次数:20414 次

验证undo空间不足时的出现的情况

先复习下什么是undo表空间

摘抄http://blog.sina.com.cn/s/blog_4e7cf89d01000cnp.html

?

UNDO表空间用于存放UNDO数据,当执行DML操作(INSERT,UPDATE和

DELETE)时,oracle会将这些操作的旧数据写入到UNDO段,在oracle9i

之前,管理UNDO数据时使用(Rollback Segment)完成的.从oracle9i

开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间.因

为规划和管理回滚段比较复杂,所有oracle database 10g已经完全

丢弃用回滚段.并且使用UNDO表空间来管理UNDO数据.


UNDO数据也称为回滚(ROLLBACK)数据,它用于确保数据的一致性.当

执行DML操作时,事务操作前的数据被称为UNDO记录.UNDO段用于保存

事务所修改数据的旧值,其中存储着被修改数据块的位置以及修改前

数据,

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之前的雇员工资,用户可以使用倒叙查询特征.

?

1.验证undo空间不足时的出现的情况
这个语句,可以看出现在未commit的事务占用的block数

select addr,used_ublk from v$transaction;

插入一条语句未提交,提交以后就不会在这个视图中了

?可以看到已经有一个commit在使用,如在表中插入几条数据,还是一样占用一个,因为插入这样一条数据占用的空间很小,但是插入数据多就不一样了

试着插入一万条记录,但是未提交
begin
for i in 1..10000
loop
insert into m values(i,'ahaoge');
end loop
;
end;
/

?

此时占用的block为87个
做一个试验,如果插入100万条记录为提交,按照上面的计算,计算大概占用的的block为8700,乘以block的大小,大概占用67M的空间,那么就会在undo中写入67M的空间,现在
使用的undo空间改为myundotbs,只有10M,会出现什么情况呢?



?再插入100万条未提交的数据


会出现这种错误
得出结论。
undo的大小还是很重要的

?

?

?