一.undo空间原理:
dml操作会产生undo数据。 update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data buffer。在修改之前,原始数据先放到undo段,并在数据块头记录undo段(acitve 状态)中该数据块的位置,读写这个块时会占用事务槽,会将该事务号记录在数据块的头部。然后在进行update,并将该块放到dirty list检查点队列,等待dbwr进行写操作。
二.创建新的undo表空间替换老的表空间:并扩展undo大小
1.查看系统默认undo表空间: SQL> show parameter undo
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string undotbs
2.创建undo表空间 SQL> create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/prod/disk3/undotbs2.dbf' size 50m;
#修改默认undo表空间,如果是pfile启动的,要修改参数文件。 SQL>alter system set undo_tablespace=undotbs2; 删除老的undo表空间 SQL>drop tablespace undotbs including contents and datafiles;
undo 表空间扩展大小 SQL> alter database datafile 8 autoextend on next 10m maxsize 500m;
三.undo段作用:
1.undo 自动管理: SQL> show parameter undo;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string undotbs
2.undo段的管理方式:
NAME ------------------------------ SYSTEM _SYSSMU1_548815$ _SYSSMU2_4162303249$ _SYSSMU3_1137786205$ _SYSSMU4_1264943161$ _SYSSMU5_1041434215$ _SYSSMU6_2715111370$ _SYSSMU7_1539595696$ _SYSSMU8_1799925899$ _SYSSMU9_3367637386$ _SYSSMU10_148416192$
11 rows selected. 一个回滚段尽量让少的事务区操作。刚开始10个回滚段,每来一个事务给一个回滚段,直到回滚段达到30个,以后就让多个事务共用同一个回滚段。
3.undo的作用:(四大作用) ①.回滚事务: dml产生的undo的量: 在dml操作提交前,可以进行回滚操作,回滚信息就是从undo段中读取的。 回滚等效于反向操作。undo不会记录语句,记录的是数据的变化。 insert产生undo 只记录rowid delete 产生undo, 记录改行全部信息 update 产生undo,修改前后的字段。
②.读一致性:(通过比较scn实现) a).oracle在dml操作提交之前,其他用户访问的数据是undo段中的镜像数据和数据块中未被修改的数据构造的CR块。这是通过对比scn号来判断数据块上的数据是否被修改。 b).任何数据的状态以开始查询的时刻的状态为准,如:数据库中有1000万行记录,一个查询需要从九点查询到九点半才能结束, 在执行查询其间数据库又插入了1000条,但select语句只会查出1000万条。
例:任何数据的状态以开始查询的时刻的状态为准。
scott@BJDB>var c_emp refcursor;
scott@BJDB> open :c_emp for select * from emp; PL/SQL procedure successfully completed.
#打印游标中的数据,其中有12条数据。 scott@BJDB>print :c_emp
12 rows selected. #当在open游标之后,在其他会话修改了查询的数据,然后再打印数据,结果不会显示修改后的内容,因为先做查询然后才做的修改。 scott@BJDB> open :c_emp for select * from emp; PL/SQL procedure successfully completed.
③.实例恢复: 如果非正常关机,实例恢复时,对没有正常提交的事务,跑redo日志会将所有的块和undo块重做一遍,如果发现没有进行提交,就进行一次回滚操作。 比如我一个小时没有提交这个事务,但是脏块累计到一定量时自动写,数据已经写入数据文件了, 并且写了redo日志,但是只要不提交,undo块就处于active,回滚时只要不提交的都回滚。 ④.倒叙查询 或叫闪回查询: 10g后增加了新特性--闪回,利用undo已经提交的块,闪回数据库和表,已经提交的块inacitive数据时不能回滚的,但可以倒回某个时间点。
3.查看undo信息: ①.查询回滚段信息 SQL> select segment_name ,owner,tablespace_name ,file_id ,initial_extent/1024 init,next_extent/1024 next,status from dba_rollback_segs;
SEGMENT_NAME OWNER TABLESPACE_N FILE_ID INIT NEXT STATUS -------------------- ------ ------------ ---------- ---------- ---------- -------- SYSTEM SYS SYSTEM 1 112 56 ONLINE _SYSSMU1_548815$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU2_4162303249$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU3_1137786205$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU4_1264943161$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU5_1041434215$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU6_2715111370$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU7_1539595696$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU8_1799925899$ PUBLIC UNDOTBS 3 128 64 ONLINE _SYSSMU9_3367637386$ PUBLIC UNDOTBS 3