1、 撤销数据的实质
修改后的数据被写到表和索引段的数据块,而原来的数据则被写入到撤销段的数据块中。
撤销数据是倒退DML语句结果所需的信息。
为了满足ACID的要求,撤销通常是自动的。
撤销会实现ACID的A,这种回滚是持久的,并且对所有用户公开。
撤销会实现ACID的C,这种回滚是临时的,并且只对运行这个查询的会话是可视的。
撤销和锁定实现ACID的I,也就是说不可能存在相互矛盾的事务。
撤销也可以用于闪回查询。闪回查询允许用户查询数据库过去的映像。实现闪回查询的回滚是临时的。
2、 撤销表空间
撤销表空间用于保存撤销段,其大小决定了实际能够保存多少撤销数据。
一个数据库中可以存在多个撤销表空间,但是任意给定时刻都只能使用一个撤销表空间。
在RAC中,打开该数据库的每一个实例都会使用自己的撤销表空间。
撤销表空间必须被创建为持久的、本地管理的并且能够自动扩展分配空间的表空间。撤销表空间不能被设为只读。
创建表空间:
|
CREATE SMALLFILE UNDO TABLESPACE "UNDO2" DATAFILE 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\undo02.dbf' SIZE 100M RETENTION NOGUARANTEE; 查询: system@ORCL> select tablespace_name, contents,retention from dba_tablespaces;
TABLESPACE_NAME CONTENTS RETENTION ------------------------------ --------- ----------- SYSTEM PERMANENT NOT APPLY UNDOTBS1 UNDO NOGUARANTEE SYSAUX PERMANENT NOT APPLY TEMP TEMPORARY NOT APPLY USERS PERMANENT NOT APPLY OCP10GDATA PERMANENT NOT APPLY UNDO2 UNDO NOGUARANTEE
已选择7行。
system@ORCL> select tablespace_name, segment_name, status from dba_rollback_segs;
TABLESPACE_NAME SEGMENT_NAME STATUS ------------------------------ ------------------------ ------------ SYSTEM SYSTEM ONLINE UNDOTBS1 _SYSSMU10$ ONLINE UNDOTBS1 _SYSSMU9$ ONLINE UNDOTBS1 _SYSSMU8$ ONLINE UNDOTBS1 _SYSSMU7$ ONLINE UNDOTBS1 _SYSSMU6$ ONLINE UNDOTBS1 _SYSSMU5$ ONLINE UNDOTBS1 _SYSSMU4$ ONLINE UNDOTBS1 _SYSSMU3$ ONLINE UNDOTBS1 _SYSSMU2$ ONLINE UNDOTBS1 _SYSSMU1$ ONLINE UNDO2 _SYSSMU20$ OFFLINE UNDO2 _SYSSMU19$ OFFLINE UNDO2 _SYSSMU18$ OFFLINE UNDO2 _SYSSMU17$ OFFLINE UNDO2 _SYSSMU16$ OFFLINE UNDO2 _SYSSMU15$ OFFLINE UNDO2 _SYSSMU14$ OFFLINE UNDO2 _SYSSMU13$ OFFLINE UNDO2 _SYSSMU12$ OFFLINE UNDO2 _SYSSMU11$ OFFLINE
已选择21行。 |
3、 事务与撤销段
撤销段的特性:
。撤销段只能存在于一个撤销表空间中。
撤销管理的特性:
。oracle 会根据需要自动生成新的撤销段,从而能够尽可能地确保多个事物必须共享撤销段。
事务与撤销段关系:任何事务生成的撤销数据都无法被分配到多个撤销段中。
撤销数据分为:
。ACTIVE:是回滚当前事务可能需要的撤销数据,在事物结束之前,这些数据不能被重写。
。EXPIRED:是事务被提交后oracle 不再需要保存的撤销数据,可以被重写。
Oracle 可以采用循环方式使用撤销段。
V$TRANSACTION视图用于产看为每个事务所指派的撤销段。
查看V$TRANSACTION,v$session,dba_rollback_segs
|
system@ORCL> select t.start_time, t.used_ublk, s.username, r.segment_name from v$transaction t, v$session s, dba_rollback_segs r where t.ses_addr=s.saddr and t.xidusn=r.segment_id; |
4、 管理撤销
4.1 与撤销相关的错误条件
管理撤销的原则:
1 应当始终存在允许所有事务继续进行的足够撤销表空间。
2 应该始终存在保证查询成功的足够撤销数据。
如果第一条原则保证不了,当某个事务耗尽了撤销空间,会出现“ora-30036”oracle错误。
如果第二条原则保证不了,长时间运行的查询会出现“ora-1555”oracle错误而失败。
4.2 用于撤销的参数
UNDO_MANAGEMENT:被设为auto,才能使用undo。UNDO_MANAGEMENT参数是静态的,如果修改必须在实例重启后才能生效。
UNDO_TABLESPACE: 这个参数指定了一个作为有效撤销表空间的表空间,并且该表空间必须已被创建为一个撤销表空间,同时其内部的所有撤销段都会被自动联机。
UNDO_RETENTION:参数指定了保留过期撤销数据的目标位置。UNDO_RETENTION的最大值总是与撤销表空间的大小一致。撤销保留保证一般用于月末进行填制报表等此类工作上。
在创建undo tablespace 时,通过retention guarantee 子句就能够启动撤销保留保证。
我们可以从sqlplus中更改某个撤销表空间的撤销保留保证,但是无法通过database control 完成相同的功能。
例子:
|
system@ORCL> create undo tablespace undo_noguarantee datafile 2 'undo_ng01.dbf' size 10m; 表空间已创建。 system@ORCL> create undo tablespace undo_guarantee datafile 'undo_g01.dbf' size 10m; 表空间已创建。 system@ORCL> alter tablespace undo_guarantee retention guarantee; 表空间已更改。 system@ORCL> --then for normal running; system@ORCL> alter system set undo_tablespace=undo_noguarantee; 系统已更改。 system@ORCL> --and for end-of-month reporting system@ORCL> alter system set undo_tablespace=undo_guarantee; 系统已更改。 |
4.3 调整和监视撤销表空间
调整撤销表空间算法:首先计算在最高负荷时生成撤销的速度,然后再乘以耗时最长的查询的时间长度。即s=vt。
使用V$UNDOSTAT视图获取需要的信息。
4.4 删除和缩小撤销段
SMON进程会每个24小时查看撤销表空间,并且删除用于满足最高工作负荷要求但已不再需要的撤销段,同时还会缩小过大的撤销段。
例子:
|
查询v$undostat system@ORCL> select begin_time, end_time, undoblks, maxquerylen, ssolderrcnt, 2 nospaceerrcnt from v$undostat;
BEGIN_TIME END_TIME UNDOBLKS MAXQUERYLEN SSOLDERRCNT NOSPACEER RCNT ----------------- ----------------- ---------- ----------- ----------- --------- ---- 26-04-12:14:57:44 26-04-12:15:07:29 98 0 0 0 26-04-12:14:47:44 26-04-12:14:57:44 40 0 0 0 26-04-12:14:37:44 26-04-12:14:47:44 4 0 0 0 26-04-12:14:27:44 26-04-12:14:37:44 24 0 0 0 26-04-12:14:17:44 26-04-12:14:27:44 21 0 0 0 26-04-12:14:07:44 26-04-12:14:17:44 4 0 0 0 26-04-12:13:57:44 26-04-12:14:07:44 101 0 0 0 26-04-12:13:47:44 26-04-12:13:57:44 21 0 0 0 26-04-12:13:37:44 26-04-12:13:47:44 4 0 0 0 26-04-12:13:27:44 26-04-12:13:37:44 14 1608 0 0 26-04-12:13:17:44 26-04-12:13:27:44 24 1305 0 0 26-04-12:13:07:44 26-04-12:13:17:44 11 696 0 0 26-04-12:12:57:44 26-04-12:13:07:44 133937 87 0 0 26-04-12:12:47:44 26-04-12:12:57:44 61 0 0 0 26-04-12:12:37:44 26-04-12:12:47:44 8 0 0 0 26-04-12:12:27:44 26-04-12:12:37:44 22 0 0 0 26-04-12:12:17:44 26-04-12:12:27:44 15 0 0 0 26-04-12:12:07:44 26-04-12:12:17:44 10 0 0 0 26-04-12:11:57:44 26-04-12:12:07:44 69 0 0 0 26-04-12:11:47:44 26-04-12:11:57:44 17 0 0 0 26-04-12:11:37:44 26-04-12:11:47:44 8 0 0 0 26-04-12:11:27:44 26-04-12:11:37:44 21 0 0 0 26-04-12:11:17:44 26-04-12:11:27:44 17 0 0 0 26-04-12:11:07:44 26-04-12:11:17:44 9 0 0 0 26-04-12:10:57:44 26-04-12:11:07:44 69 0 0 0 26-04-12:10:47:44 26-04-12:10:57:44 15 0 0 0 26-04-12:10:37:44 26-04-12:10:47:44 13 0 0 0 26-04-12:10:27:44 26-04-12:10:37:44 19 0 0 0 26-04-12:10:17:44 26-04-12:10:27:44 20 0 0 0 26-04-12:10:07:44 26-04-12:10:17:44 14 0 0 0 26-04-12:09:57:44 26-04-12:10:07:44 140 0 0 0 26-04-12:09:47:44 26-04-12:09:57:44 23 0 0 0 26-04-12:09:37:44 26-04-12:09:47:44 5 0 0 0 26-04-12:09:27:44 26-04-12:09:37:44 107 0 0 0 26-04-12:09:17:44 26-04-12:09:27:44 249 0 0 0
已选择35行。
计算所需表空间 select (select max(undoblks) * max(maxquerylen) / 600 from v$undostat) * (select value from v$parameter where name='db_block_size') "tablespace_size(bytes)" from dual;
tablespace_size(bytes) ---------------------- 2940527903 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9537053/viewspace-722321/ ,如需转载,请注明出处,否则将追究法律责任。