UNDO段是用于存储还原数据的特殊段,在发生实例故障的时候,undo段用来对数据进行恢复
一.undo段的作用
rdbms(关系型数据库管理系统)必须要提供一致性的数据,以确保不会丢失数据或导致数据混乱。
当执行insert,update,delete等dml操作时,服务器进程会将原有数据(称为undo数据)存放到undo段
中,undo段是用于存储还原数据的段。
undo数据也成为回滚(rollback)数据,它用于确保数据的一致性。当执行dml操作时,操作前的数据被称为undo记录。
Undo段有以下几个用途
1.事务处理回退
即执行rollback语句取消事务,此时系统将回滚段中的undo数据从undo段中写会到数据段。
2.事务处理恢复
事务恢复由oracle server自动完成。如果实例在事务处理正在进行时失败(instance failure),那么oracle
服务器需要在数据库下次打开时回退所有未提交的事务。对还原段所做的更改同样受重做日志的保护。
3.读一致性
oracle服务器保证一条语句所看到的数据来自一致的时间,即使事务处理修改了该数据
二.自动undo空间管理
从Oracle9i开始,管理undo数据有两种方法,一种是自动管理方式,通过undo表空间来自动管理
undo数据。另外一种是手工管理方式,即使用undo段管理undo数据。
undo表空间是指专门存放undo数据的表空间,并且只能存放会滚蛋而不能存放其他的事务段,当使用
undo表空间时,oracle会自动在该表空间上建立还原段,以供事务操作。
undo表空间上的还原段,命名方式:_SYSSSMUn$,如:_SYSSMU10$,_SYSSMU11$
如果使用自动管理模式,必须要将初始化参数undo_management设置为auto
SQL> show parameter undo_retention;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
当启动oracle服务器之后,Oracle会自动使用undo表空间自动管理Undo数据,并且oralce自动选择
第一个可用的undo表空间存放Undo数据。在有多个undo表空间的情况下,可以通过设置初始化参数
undo_tablespace选择使用的undo表空间。但如果没有undo表空间,oracle会使用system还原段存放
undo记录。
三.undo表空间管理参数
1.undo_management
指定数据库Undo数据的管理模式,可以设置为auto和manual。undo_management不能再数据库启动
后进行动态更改。
auto模式将数据库设置为自动还原管理,并需要Undo表空间。
manual模式(缺省值),可以根据需要在数据库中创建和管理还原段
2.undo_tablespace
指定在自动管理模式下使用的undo表空间。此参数可以在初始化文件中设置,或使用alter system命令来
动态改变。如:alter system set undo_tablespace=undotbs;
3.undo_suppress_errors
使用undo_suppress_errors,用户可以避免在自动管理模式下执行手动还原管理模式操作时出现错误,
例如,有一个使用set transaction use rollback segmenbt语句的应用程序,则可以在该应用程序添加语句
alter session set undo_supperess_errors=true以避免ora-30019错误(在自动还原模式下执行了非法的回退段)
4.undo_retention
用于指定保留undo数据的时间,以便提供读一致性,默认值为900s。以秒为单位定义的undo_retention可以在初始化文件中
设置,或使用alter system命令来动态修改。
SQL> alter system set undo_retention=1200 scope=both;
System altered.
System altered.
else:如果undo表空间设置的太小,即使设置了undo_retention,仍不能按指定的时间保留还原数据。oracle服务器使用
一种算法在Undo表空间内分配空间,比如有新的事务产生,如果没有空闲的undo空间,oracle就会使用不活动的
旧事务未过期的还原段空间来为新事物分配还原段。
三.创建undo表空间
自动还原管理需要一个undo表空间,但数据库可能有多个undo表空间,但只能有一个undo表空间处于活动状态。
1.在创建数据库时创建undo表空间
在create database命令中添加一个字句:
undo tablespace undotbs1
datafile '...' size 20m
autoextend on
如果在创建数据库期间,将undo_management参数设置为auto并在create database 语句中省略了undo表空间字句,
那么oracle服务器将创建一个名为sys_undotbs的undo表空间。其对应数据文件的大小取决于操作系统,并且将数据文件的
autoextend 属性设置为on。
2.命令行创建undo表空间
SQL> create undo tablespace undotbs2 datafile '/oracle/app/oracle/oradata/orcl/undotbs2.dbf' size 10m;
Tablespace created.
Tablespace created.
SQL> create table t tablespace undotbs2 as select * from all_objects;
create table t tablespace undotbs2 as select * from all_objects
*
ERROR at line 1:
ORA-30022: Cannot create segments in undo tablespace
create table t tablespace undotbs2 as select * from all_objects
*
ERROR at line 1:
ORA-30022: Cannot create segments in undo tablespace
四.切换undo表空间
undo_tablespace是一个动态参数,所以可以动态切换表空间。
SQL> alter system set undo_tablespace=undotbs2;
System altered.
System altered.
在成功切换undo表空间后,任何新开始的事务都将在新的undo表空间中保存还原记录,但旧的undo表空间可能保留
当前未提交的事务还原记录,这时,旧的undo表空间不会立即进入脱机状态,将进入悬挂脱机状态(pending offline)。
在这种状态下,当前未提交的事务仍将使用旧的undo表空间,但是新事务的还原纪录不允许保留在旧的undo表空间中。
直到当前未提交的事务全部结束后,旧的undo表空间才进入脱机状态。
五.修改undo表空间
a.增加数据文件
SQL> alter tablespace undotbs2 add datafile '/oracle/app/oracle/oradata/orcl/undotbs02.dbf' size 10m;
Tablespace altered.
Tablespace altered.
b.修改数据文件大小
SQL> alter database datafile '/oracle/app/oracle/oradata/orcl/undotbs2.dbf' resize 30m;
Database altered.
Database altered.
六.删除undo表空间
drop tablespace undotbs2;
只有在undo表空间没有被数据库使用时才可以删除它。此外,如果undo表空间中含有任何未完成的事务还原记录(比如
某个事务被意外终止,但还没有被恢复),则不能使用drop tablespace命令删除。
使用一下语句可以查询undo table中活动的还原段
SQL> SELECT a.name,b.status
2 FROM v$rollname a,v$rollstat b
3 WHERE a.name IN ( SELECT segment_name
4 FROM dba_segments
5 WHERE tablespace_name = 'UNDOTBS1')
6 AND a.usn= b.usn;
NAME STATUS
------------------------------ ---------------
_SYSSMU1_1240252155$ ONLINE
_SYSSMU2_111974964$ ONLINE
_SYSSMU3_4004931649$ ONLINE
_SYSSMU4_1126976075$ ONLINE
_SYSSMU5_4011504098$ ONLINE
_SYSSMU6_3654194381$ ONLINE
_SYSSMU7_4222772309$ ONLINE
_SYSSMU8_3612859353$ ONLINE
_SYSSMU9_3945653786$ ONLINE
_SYSSMU10_3271578125$ ONLINE
2 FROM v$rollname a,v$rollstat b
3 WHERE a.name IN ( SELECT segment_name
4 FROM dba_segments
5 WHERE tablespace_name = 'UNDOTBS1')
6 AND a.usn= b.usn;
NAME STATUS
------------------------------ ---------------
_SYSSMU1_1240252155$ ONLINE
_SYSSMU2_111974964$ ONLINE
_SYSSMU3_4004931649$ ONLINE
_SYSSMU4_1126976075$ ONLINE
_SYSSMU5_4011504098$ ONLINE
_SYSSMU6_3654194381$ ONLINE
_SYSSMU7_4222772309$ ONLINE
_SYSSMU8_3612859353$ ONLINE
_SYSSMU9_3945653786$ ONLINE
_SYSSMU10_3271578125$ ONLINE
10 rows selected.
如果查询没有返回结果行,则表明所有事务均以处理完成,并且可以删除undo tablespace
切换到另一个undo表空间后,oracle服务器可以引用原来的undo表空间为查询提供读一致性。
当原来的undo表空间无法提供读一致性后,需要改undo表空间信息的查询就会收到以下错误:
ORA-1555快照已过期。