日期:2014-05-16 浏览次数:20430 次
先复习下什么是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的大小还是很重要的
?
?
?