Snowfun

导航

 

回退段9i前叫rollback,回退段9i后叫undo,回退段存放事务影响过的数据,回退段有手工和自动两种管理方式。

回退段的四大作用
交易的回退:没有提交的交易可以后悔.
交易的恢复:数据库崩溃的时候,将写入磁盘的不正确数据恢复到交易前.
读一致性:查询时结果集已经确定.
闪回数据:从回退段中构造历史的数据.


系统回退段:存在于system表空间,不受我们控制,只有system表空间内的对象才可以使用

select from v$rollname;

 

复制代码
--建立undo表空间
create undo tablespace undo2 datafile 'D:\ORACLE\ORADATA\O10\undo2.dbf' size 2m;
--验证
select SEGMENT_NAME,OWNER,TABLESPACE_NAME,STATUS from dba_rollback_segs;
--切换
Alter system set undo_tablespace =undo2;
--当前在线的回退段
Select from v$rollname;

--删除回退表空间
----1。先切换到其它回退表空间
----2。等待事务结束
3。Drop tablespace undo2;
复制代码

 

实例:数据库手工管理回退段管理
1.undo_management =manual;
2.startup force;
3.建立新的回退段
    create rollback segment r1 tablespace undo2;
4.online       
    alter rollback segment r1 online;
5.查看          select * from v$rollname;
6.offline      alter rollback segment r1 offline;
7.删除         drop rollback segment r1;
手工管理很好,一切都由我们控制,多少,大小,指定事务用指定的回退.


实例:通过回退段闪回历史数据
目的是使用回退的四大作用之一,闪回历史的数据,通过回退段来闪回老交易的数据,闪回到指定的scn点
--当前系统的SCN号
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()  from dual;
改变表的数据,提交
update scott.emp set sal=sal+1;
Commit;
闪回
execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_number (#####);
--结束闪回
execute dbms_flashback.disable();

闪回到指定的时间点
物理时间和数据库间的SCN的对照表,每五分钟采样

select to_char(TIME_DP,'yyyy/mm/dd:hh24:mi:ss'),SCN from SYS.SMON_SCN_TIME;

Execute  dbms_flashback.enable_at_time(to_date('2004/11/24:16:20','yyyy/mm/dd:hh24:mi:ss'))

闪回---取值到游标----停止闪回----将游标中的值插入原表

复制代码
declare 
cursor c1 is select from scott.e2 where empno=7369;
v_sal c1%rowtype;
begin
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_number (13346413);
open c1;
fetch c1 into v_sal;
dbms_flashback.disable();
update scott.e2 set sal=v_sal.sal where empno=v_sal.empno;
close c1;
end;
复制代码

 

 

实验:闪回数据的查询方法,以及历史交易
该实验的目的是查询一张表的历史数据变化的痕迹.在回退段中查询.
闪回版本查询(10g新特性)
conn scott/tiger
drop table t1 purge;
create table t1 as select ename,sal from emp where empno=7900;

update t1 set sal=1000;
commit;
update t1 set sal=2000;
commit;

产生一些交易
insert into t1 select ename,sal from emp where empno=7900;
commit;
insert into t1 select ename,sal from emp where empno=7902;
commit;
insert into t1 select ename,sal from emp where empno=7839;
commit;
update t1 set sal=3000 where empno=7902;
commit;

col VERSIONS_STARTTIME for a25
col VERSIONS_ENDTIME for a25

select versions_starttime, versions_endtime, versions_xid,
versions_operation, sal
from t1
 versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME;

取一个时间段的版本
select versions_starttime, versions_endtime, versions_xid, versions_operation, rate from rates versions between timestamp to_date('12/11/2003 15:57:52', 'mm/dd/yyyy hh24:mi:ss') and maxvalue order by VERSIONS_STARTTIMe ;

查看原sql语句
SELECT UNDO_SQL FROM FLASHBACK_TRANSACTION_QUERY WHERE XID = '08001100C7010000';

多次drop 后,建立同名称表
conn scott/tiger
drop table t1 purge;
create table t1 as select ename,sal from emp where empno=7900;
drop table t1;
create table t1 as select ename,sal from emp where empno=7902;

drop table t1;
create table t1 as select ename,sal from emp where empno=7839;

show recycl
FLASHBACK TABLE T1 TO BEFORE DROP RENAME TO T8;
FLASHBACK TABLE T1 TO BEFORE DROP RENAME TO T9;

知识点
在回退段中获取以前的数据
在回收站里恢复表并更改名称
1。手工指定到闪回的scn
2.利用伪列,进行查询
3。将回收站的表,复原并更改名称

posted on 2016-10-15 09:32  Snowfun  阅读(232)  评论(0)    收藏  举报