一、undo是什么:
1、原始修改之前的数据副本
db buffer pool中的数据 修改后记录到 undo 表空间
多次更改的数据副本多会记录
2、针对更改事务处理而捕获
事务级别的:只要commit就会写到undo(原子性)
3、至少保留到事务处理结束
还原数段段(extent)
自动管理:
先分配10个段(每个事务占用一个段)
第11个事务进来时再分配1个(使用一个增加一个)
事务结束undo段不会被马上回收(激活(正在使用),未过期(保留时间内,理论上不可以被覆盖,但是现实不一定),过期(可以被覆盖的)等状态)
undo表空间不足:
找之前用过的段,如果是事务已经结束了的,把之前undo段覆盖
只要事务没结束,undo段不会被覆盖
4、支持回退
事务中修改了的数据放到undo其他事务可以去undo读原数据
5、读取一致性查询
数据块:
块头:
ITL(事务曹)
修改数据未commit:itl中会记录旧值放在undo的哪个地方
另一个会话来查询:
发现数据块已经在内存中
先看头部,如果前面修改事务未提交去undo找数据
6、oracle闪回查询
闪回用的是undo中的数据
7、失败的事务处理中进行恢复
update操作修改了数据后 未commit数据,如果此时进行出现故障需要进行恢复
pmon进程由undo里面记录的数据进行回退
回退的过程中会一直占有undo块,可能会导致undo段大量增长
二、undo怎么记录的:()
1. undo 进行镜像:不是进行数据块级别的镜像.,是进行行级别的镜像
2. 如果事务只是涉及到某个列,那么只进行列级别的镜像,如果是行,那么就是行级别的镜像
4. update操作, undo会记录行的rowid,同时会记录操作列的前镜像;
rowid记录: 哪个文件的哪一个块的哪一行
rollback 时 只涉及到列
5. delete操作, undo会记录行的rowid,同时会记录整行的前镜像;
rollback时 需要insert整行
6. insert操作, undo会记录行的rowid.
rollback时 只需delete行
ddl语句:不记录undo语句(不存在事务概念)
dml语句:记录undo语句
三、还原段管理:
查看undo情况:
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO #管理方式 自动管理
undo_retention integer 900 #至少保留时间 900s(并不确定) (当空间不足时依然会被覆盖,不保留这么长时间)
undo_tablespace string UNDOTBS1 #当前使用的undo
查看当前激活事务使用回滚段的情况及当前回滚段的大小 :
SQL> select n.usn,n.name,s.rssize,s.xacts,s.status from v$rollname n, v$rollstat s WHERE n.usn = s.usn and s.xacts > 0;
查看undo表空间使用状态:
SQL> SELECT tablespace_name, status, SUM (bytes)/1024/1024 "Bytes(M)" FROM dba_undo_extents GROUP BY tablespace_name, status;
当undo表空间增长较快时,要从以下角度考虑进行控制:
1. 如果undo表空间是自动扩展的,将自动扩展关闭。如果undo表空间自动扩展,即使有过期的undo段,它也不会重用,而是选择增大数据文件。
alter database datafile '<datafile path>' autoextend off;
2. 对数据文件进行裁剪;
alter database datafile '<datafile path>' resize <new size>;
3. 减少UNDO_RETENTION参数值。
设定UNDO_RETENTION参数值时,参考V$UNDOSTAT里MAXQUERYLEN(执行时间最长的事务的执行时间)。
select max(MAXQUERYLEN) from V$UNDOSTAT;
创建新的 undo表空间:
SQL> create undo tablespace UNDO_TBS1 datafile 'undotbs1.dbf' size 100m;
SQL> alter system set undo_tablespace=undo_tbs1;
SQL> drop tablespace undo_rbs0 including contents.
如果在删除以前undo表空间时出现ORA-30013错误,则需要等待所有事务提交之后,才能删除以前undo表空间