oracle-dba-UNDO表空间管理

UNDO表空间管理
还原数据是为了实现数据更改的同时,其他用户或进程可以并发访问正在更新而没有提交的数据。
引入还原段的作用
解决修改数据时并行读数据的问题,即事务恢复,事务回滚,读一致性
当用户修改数据时,该数据首先复制到还原段上,一个事务将他需要修改的全部数据放在同一个还原段中。

事务恢复:将还原段上数据的变化记录在重做日志文件中。事务执行期间数据库实例崩溃,重启还原没提交的数据。
事务回滚:用户使用rollback,oracle服务器数据库就使用还原段中的数据完成数据的回滚
读一致性:用户修改数据,未提交,其他用户访问读取时,看到没被修改提交的数据,这些数据放在还原段中

还原段如何完成读一致性
表中有1W条数据,9点读取,9点15结束。按理说应该有1W条数据,可是中途有用户删除了一条数据,查询的是9999则为脏读。1W条才是正常。而还原段就是为了保证读取的是1W条。此为读一致性。
用户在9点发出select时,服务器会记录9点那个时候的SCN号(SCN号是以时间戳作为参数的一个函数返回值。Scn可以和时间戳相互转换),该SCN号应该大于T表中等于所有记录在数据块头部的ITL槽中的SCN号(多个ITL,SCN为最大那个)。服务器进程扫描T表,会把头部的ITL中的SCN和当前SCN比较,如果比他小,说明没修改,比他大说明修改,为了保证读一致性,会去根据ITL槽中记录的UNDO块的地址。进行读取。
若ITL槽中的SCN>9,接着找ITL槽中的UNDO地址,接着在找。直到找到比9点小的SCN,读取。没有找到ORA-1555 snapshoot too old
事务提交以后,undo回滚段就可以被覆盖,出现1555不可避免。
还原段的实例恢复与实务回滚
实例恢复时,oracle会读取回滚段的头部记录的事务表,每一个事务是否提交等信息都存在里面,对于未提交的事务完成回滚
回滚时(错误或者rollback都会产生),根据ITL槽中记录的undo数据块的地址找到undo数据块,从而实现恢复数据,即回滚事务。

Undo segment选择算法
将每一个undo segment绑定一个事务,
没空闲的undo segment,系统尝试将脱机的undo segment联机
没有可用的,创建新的,不能创建新的,寻找最早使用的undo segment。这种情况下
一个undo segment可能绑定多个事务同时进行。每隔12小时会收缩一次,删除idle状态的extent。
Dml操作需要undo时,发现空间不够,会唤醒SMON进行一次收缩将undo segment里面暂时没有使用的extent使用

讨论undo_retention参数
时间值:说明当还原段中的数据在事务提交后继续保留的时间。默认900秒。超过时间该undo块可以被其他事务覆盖.
使用aum,设置undo_retention后,undo存在4状态
Active:正在使用事务,还没有提交|回滚
Inactive:没有活动事务,可以被其他事务覆盖
Expired:inactive时间超过undo_retention指定时间
Freed:数据块是空的,从未被使用
Undo表存在多个undo segment,undosegment存在多个extents。
Oracle11g中,undo表空间足够,oracle会将undo信息保留的时间与当前运行时间最长的查询所需要的时间相同。
默认情况下,oracle每隔30秒收集统计信息来自动调整undo retention。收集信息包括运行时间最长的查询和产生undo的速度。设置undo retention为0,使用自动调整功能。并且900秒最低限。不为0则不支持自动调整。
设置undo_retention的值
Alter system set undo_retention=1200;
校验值
Show parameter undo;
方式2
Select name,value from v$parameter where name=’undo_retention’;
Undo表空间数据文件可以设置自动扩展。
还原段分类
分为2类,系统还原段和非系统还原段。
系统还原段:系统表空间使用,当系统表空间中的对象发生变化,这些对象的原始值保存在此。可工作自动模式和手动模式。
非系统还原段:非非系统表空间使用。如用户表空间。
当一个数据库具有非系统表空间时,至少要一个非系统还原段|自动管理的还原表空间。
自动管理模式由数据库服务器自动维护,但至少需要一个还原表空间。
手动管理模式需要管理员创建非系统还原段。
手动的非系统还原段包括2类型,公有还原段(RAC多实例)和私有还原段。
Oracle9i以上都实现还原度胺的自动管理
使用自动管理需要首先创建一个还原表空间。并经还原表空间告诉数据库服务器,之后的维护工作由数据库服务器自动完成。

ORACLE自动还原段管理
设置还原段自动管理,设置2参数
1:undo_management,说明还原段的管理方式。不是动态参数,需要在参数文件中修改,然后重启服务器生效
2:undo_tablespace:说明还原表空间名字,动态参数
查看和还原段相关参数,也可以在init.ora配置文件看
Show parameter undo;
AUTO自动管理,还原表空间UNDOTBS1;
修改还原表空间
Alter database set undo_tablespace undo_tablespace_name;
创建还原表空间
创建还原表空间,自动扩展
Create undo tablespace my1_undo
Datafile
‘G:\oracleDB\temp\my1_undo.dbf’
size 100m
autoextend on;
查看还原表空间信息
select tablespace_name,extent_management,contents,logging,status from
dba_tablespaces where contents=’UNDO’;
本地管理。LOGGING说明受到重做日志保护。在线,说明随时可以切换指令到此还原表空间。
查看还原表空间数据信息
Col tablespace_name for a15
Col file_name for a20
Select tablespace_name,file_name,bytes/1024/1024 MB,autoextensible from dba_data_files Where tablespace_name= ‘MY_UNDO’;

维护还原表空间
重命名还原表空间
Alter tablespace my_undo rename to lin_undo;
向还原表空间增加数据文件,达到增加还原表空间的容量
Alter tablespace lin_undo add datafile ‘G:\oracleDB\temp\MY_UNDO1.DBF’
size 100m;
查看添加成员信息
Select tablespace_name,file_name,bytes/1024/1024 MB,autoextensible from
dba_data_files Where tablespace_name=’LIN_UNDO’;
设置数据文件为自动扩展
Alter database datafile ‘G:\ORACLEDB\TEMP\MY_UNDO1.DBF’ autoextend on;

切换还原表空间
Oracle只允许有一个活跃的还原表空间
切换还原表空间
Alter system set undo_tablespace=’LIN_UNDO’;
验证是否成功undo_tablespace为LIN_UNDO说明成功
Show parameter undo;

删除undo表空间实例
1:创建undo
Create undo tablespace my2_undo
Datafile
‘G:\oracleDB\temp\my2_undo.dbf’
size 100m
autoextend on
retention guarantee;保证给定时间内还原记录不会飞覆盖。
2:创建表,并插入数据,模拟事务
Create table t(id number,name varchar2(20));
Insert into t values(1,’hello’);
3:切换undo表空间
Alter system set undo_tablespace= my2_undo;
确认修改成功
Show parameter undo;
4:删除旧的表空间undotbs,此时报错,因为有活动事务。
Drop tablespace LIN_UNDO ;= Drop tablespace LIN_UNDO including contents;
提交后
Commit;
继续删除表,失败,因为该undo 的参数undo_retention,在该参数范围内。Oracle依然会保留就得undo记录。所以不允许删除

设置retention guarantee属性,保证足够的时间内undo信息不会被覆盖掉
Alter tablespace undotbs1 retention guarantee;

Dba_undo_extents数据字典
插入数据后,查看回滚段的名字
Select a.username,b.name,c.used_ublk from v sessiona,v rollname b ,v transactioncWherea.saddr=c.sesaddrandb.usn=c.xidusn;使:SYSSMU283237543520
查看该回滚段所在的表空间以及区段信息
Select segment_name,tablespace_name,extent_id from dba_undo_extents where segment_name=’_SYSSMU28_3237543520$’;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值