UNDO表空间与Undo的认识

undo的三大作用:
1.提供一致性读。2.回滚事务。3.实例恢复
查看表空间是属于temporary,undo还是permanent?
select tablespace_name,contents,status from dba_tablespaces where tablespace_name like '%UNDO%';

1.管理Undo表空间
--创建新的Undo表空间
CREATE UNDO TABLESPACE UNDOTBS2
datafile '/paic/g2bh8060/dev/xqd/oradata/hd02ntlf/undotbs2_01.dbf'
size 500m autoextend on RETENTION NOGUARANTEE;
默认是NOGUARANTEE
--为Undo表空间增加文件
alter tablespace undotbs1 add datafile '/u01/oracle/undo01.dbf' size 500m autoextend on;
alter tablespace undotbs1 add datafile '+DATA_MIDG' size 500m autoextend on;
查询与更改undo表空间是否retention guarantee
select tablespace_name,RETENTION from dba_tablespaces where tablespace_name like '%UNDO%';
ALTER DATABASE UNDOTBS01 RETENTION GUARANTEE|NOGUARANTEE;
更改系统默认表空间
show parameter undo_tablespace
alter system set undo_tablespace=undotbs2;
undo表空间删除
drop tablespace undotbs1 INCLUDING CONTENTS AND DATAFILES;
undo表空间更名
alter tablespace undotbs2 rename to undotbs1;
重建undo表空间
1.因为延迟段创建的原因,可以先将参数取消;
show parameter segment
alter system set deferred_segment_creation=false;
2.创建undotemp表空间
3.alter system set undo_tablespace=undotemp;(如果延迟段创建特性启用了,会提示表空间不存在)
4.旧的undotbs1 drop掉。
旧的表空间现在是pending offline状态,等待offline,要等其上的事务都结束后才能真正offline。
ORA-30013: undo tablespace 'UNDOTBS1' is currently in use
5.新的rename成旧的。

2.认识UNDO
undo相关参数:
undo_management AUTO --9i以后我们undo_management都用auto
undo_tablespace UNDOTBS2 --可以动态指定系统undo表空间
undo_retention 900 --单位秒,默认900
undo_retention是针对select操作的,比如闪回查询,我们一般希望能闪回查询3小时内的数据。
事务中的undo块都是active的,事务结束后的块是inactive的,inactive的undo块在过了undo_retention 指定的时间后,就会变成expired。
比如DB最长的查询也在5分钟内,那我undo_retention只要设成300,那么这个select会遭遇01555快照太旧的可能性就比较小,但不保证。
ALTER SYSTEM SET undo_retention=10800 SCOPE=BOTH;
我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要指定一个UNDO 表空间。 如果设为manual,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。
假如数据库中用RETENTIONGUARANTEE子句配置了保证保留撤销。如果撤销表空间太小不能满足使用它的所有活动事务,那么会发生以下情况:
1、如果撤销表空间用完85%,Oracle将发布一个自动表空间警告
2、当撤销表空间用完97%时,Oracle将发布一个自动表空间严重警告
3、所有DML语句将不允许,并且会接收到一个空间超出错误
4、DDL语句允许继续执行
所以PA数据库undo表空间都是NOGUARANTEE,无论生产还是测试库。
RETENTIONGUARANTEE的情况下, undo_retention秒数内的undo都不能被覆盖,所以如果expired与freed的块几乎没了,Undo表空间也不能自动扩展,就会报上面的错误。
undo_retention参数的作用,在 RETENTIONGUARANTEE的情况下,可以作为是否保证undo块不被覆盖的分界线,而在没有设retention的情况下,例如PA的情况,就是作为是否被优先覆盖的分界线。所以此处只有两个优先级,在线的任何一边,都是随机随意地没优先级地覆盖的。
Undo表空间中已经分配给表空间的extend大小。
@tsfree
select d.tablespace_name,
       space "SUM_SPACE(M)",
       blocks sum_blocks,
       space - nvl(free_space, 0) "USED_SPACE(M)",
       round((1 - nvl(free_space, 0) / space) * 100, 2) "USED_RATE(%)",
       free_space "FREE_SPACE(M)"
  from (select tablespace_name,
               round(sum(bytes) / (1024 * 1024), 2) space,
               sum(blocks) blocks
          from dba_data_files
         group by tablespace_name) d,
       (select tablespace_name,
               round(sum(bytes) / (1024 * 1024), 2) free_space
          from dba_free_space
         group by tablespace_name) f
 where d.tablespace_name = f.tablespace_name(+)
 order by 1;
其中USED_SPACE(M)里面,都是已经分配给表空间使用的。里面有4钟状态的undo块。
undo块存在的四种状态
select tablespace_name,status,sum(bytes)/1024/1024 mb from dba_undo_extents group by tablespace_name,status;
active:表示正在使用该undo的事务还没有commit或rollback
UNEXPIRED(inactive):表示该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。
expired:表示该undo块持续inactive的时间超过undo_retention所指定的时间
freed:表示该undo块内容是空的,从来没有被使用过。
一个事务申请Undo表空间:
1.如果undo表空间是可以自动扩展的,首先自动扩展。
2.如果没得扩展了,就找free的区用。
3.没有free的区了,就找expired的undo区用。
4.没有expired的,就找unexpired的,此时这些区还没过undo_retention时间,所以会导致闪回查询无法保证使用咯。
5.还是没有的话,报错,active的区肯定不会被使用的。
Retention Guarantee模式下,一个事务申请undo表空间只走上述的第1,2,3点。3点走完后也申请不到Undo空间就报错。也就是说undo_retention时间内的undo块一定不会被覆盖。

往数据库中做导数操作,批量DML而又长时间不能commit的操作的时候,要给Undo表空间加几个文件,并且开自动扩展,保持监控

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值