撤销表空间
撤销表空间用于存放撤销信息,当执行了DML操作,即insert、update、delete时,oracle会将这些旧数据写入UNDO段中,而undo段是存在于undo表空间中。
撤销表的作用
undo表空间中的段也称为撤销段或是undo段,撤销段中存放的数据是“撤销信息”
- 读写一致
oracle只会给用户提供被提交的数据。例如执行update emp set sal=5000 where empno=7788 语句时,旧的数据会被存放在undo段中,而新的数据会被存放在emp段中。假如此时该数据尚未提交,然后执行select sal from emp where empno=7788语句时,查询出来的不是5500,而是从撤销段中获取的旧的数据 - 可以回滚事务
当执行updae操作时,旧的数据会保存在undo段中,新的数据会存在emp段中,如果提交事务失败,oracle会把undo段中的数据全部回写到原表的数据段中 - 闪回操作
oracle11g新增强大的闪回操作,很多闪回技术都是通过undo技术实现的,例如闪回表、闪回事务查询、闪回版本查询等
撤销表空间的初始化参数
oracle初始化时会指定撤销表空间的某些参数
- undo_tablespace
该参数指定使用哪个撤销表空间,在使用自动undo管理模式时,需要用该参数指定 - undo_management
该参数初始化undo数据的管理模式,如果为auto,则为自动管理模式,如果为manual,则为回滚段管理模式
注意如果没有指定undo_tablespace,会自动选择第一个undo表空间存放undo 数据,如果没有可用的undo表空间,oralce会使用system的回滚段存放undo数据,并在alter文件中记载警告。最好不要这样 - undo_retention
该参数用于控制undo数据的最大保留时间,默认为900秒。
如果想知道undo表空间的参数,可以通过show parameter命令查询
撤销表空间的基本操作
- 创建undo表空间
例如创建一个撤销表空间,并指定数据文件大小为100MB,代码如下
create undo tablespace undo_tbs_1
datafile 'D:\oralcefiles\oralcedata\undotbs1.dbf'
size 100m;
注意 在创建表空间时,需要注意以下两个方面:
- undo表空间的数据文件的大小由dml操作可能产生的最大数据量来确定,通常文件大小在1G左右
- undo的表空间只存发撤数据,所以不要在undo表空间内建议任务数据对象(如表、索引)
- 修改undo表空间
向表空间添加一个新的数据文件,指定文件大小2GB。
alter tablespace undo_tbs_1
add datafile 'D:\oralcefiles\oracledata\undotbs_add.dbf'
size 2g;
- 切换undo表空间
alter system set undo_tablespace=undo_tbs_1
- 删除undo表空间
删除undo表空间时,先切换表空间,再删除
alter system set undo_tablespace=undotbs1
drop tablespace undo_tbs_1
- 查询表空间信息
- 当前使用undo表空间
show parameter undo_tablespace;
- 查询所有undo表空间
select tablespace_name from dba_tablespace where contents='undo'
- 显示活动事务信息
执行DML操作时,oracle会把旧的数据放到undo段中,如果要显示会话信息,可以使用v$ session;如果要显示事务的详细信息,则可以使用v$ transaction
select name,status from v$transaction
- 显示undo区的信息,显示段名字,编号,大小,状态(active活跃,expired空闲)
selct segment_name,extent_id,bytes,status from dba_undo_extents where segment_name='_syssmu3_991555123$';