UNDO表空间又称为,回滚表空间,撤销表空间。Undo segment保存在UNDO 表空间,一个数据库可以有多个UNDO表空间,但是在同一时刻中,只能使用同一个UNDO表空间。
一、UNDO表空间的作用和机制
对于DML语句,只要修改了数据块,Oracle就会把原来修改前的数据块保留下来,存储在Undo segment (回滚段),当执行rollback操作时,把原先的数据重新覆盖回来。回滚段存放在UNDO表空间中。UNDO表空间的管理分为手动管理和自动管理。在11g中默认是采用自动管理模式。
UNDO的作用:把原来修改前的数据块保留下来。主要用于 一致性读,回滚事务,实例恢复。
一致性读的例子:用户 A 执行一个SQL查询操作select * from salary_tbl .需要1分钟。此时用户B执行了
update salary_tbl set salary=2000 where salary = 1000; 那么用户A查询的数据 salary 是1000 而不是2000,当前时刻查询的数据。如果UNDO表空间大小不足会把UNDO的空间进行覆盖,此时查询原来的数据就查询不到了,此时报ORA-1555错误:snapshoot too old
数据库coredown后的实例恢复:是在 SMON进程完成前滚并打开数据库以后发生,SMON进程回去查看UNDO SEGMENT第一个数据块中记录的事务表,在数据库宕机时将没有提交也没有回滚的事物全部回滚。
undo_retention :为UNDO块中的属性,决定了undo块中的数据至少保存多少秒。例如一个100秒的查询,undo_retention为50。如果在UNDO空间不足的情况下会优先重置过期的数据。如果没重置则还可以查询,如果重置了数据,那么此时100秒的查询操作就会报ORA-1555错误。
retention garentee : 为UNDO块中的属性,10g开始的新特性。确保 UNDO段中的数据未到 undo_retention 绝不会被覆盖。
所以利用UNDO表空间的优先顺序是: 空undo数据块 >undo_retention 到期的数据块 >未设置retention garentee的数据块 >报错
二、UNDO表空间的相关操作
查询表空间select * from dba_tablespaces. 。 只要字段 CONTENTS的值是UNDO 就是UNDO表空间 ,
查看UNDO表空间管理方式 : >> show parameter undo_management
创建UNDO表空间:
create undo tablespace temp2 tempfile
'D:\ORACLE\ORADATA\ORCL\undo2_01.dbf' size 10m autoextend on;
给表空间分配临时文件: alter tablespace <spacesname> add tempfile '<路径/文件名.dbf>' size [100m] autoextend on ;
查看默认UNDO表空间: show parameter undo
系统默认UNDO表空间切换 alter system set undo_tablespace = '<spacesname>';
启用[取消] retention garentee: alter tablespace <spacename> retention [ [garentee] or [nogarentee] ];
查询 retention garentee 状态: select tablespace_name,a.retention from dba_tablespaces a ;
更改undo_retention : alter system set undo_retention =1000;
查询UNDO 表空间使用情况 : select * from v$undostat ; (UNDOBLKS 使用的数据块 TXNCOUNT 事物数 BEGIN_TIME 和END_TIME UNDO生效时间和结束时间)
三、11g 的UNDO表空间的新特性
RMAN备份恢复UNDO表空间:是一个关于UNDO表空间的备份优化,在11g之前,都是自动把UNDO表空间的所有进行备份。现实的生产环境中,UNDO表空间的历史数据都是十分庞大的,备份用不上的数据不紧占空间,而且影响执行效率。RMAM备份:已经提交数据就不需要再备份了 。