欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

UNDO表空间与Undo的认识

程序员文章站 2022-05-29 19:58:12
...

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的三大作用: 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表空间加几个文件,并且开自动扩展,保持监控