Oracle 10g的闪回机制【20081016】
- 格式:doc
- 大小:113.50 KB
- 文档页数:9
oracle 10g闪回技术总结oracle 10g的闪回一共有三种:1、全库闪回2、表被drop后的闪回3、表被dml操作之后的闪回(dml操作指delete、insert、update三种操作)一、介绍各种闪回和那些因素有关1)全库的闪回由于需要的空间是当前数据库空间大小的两倍(即如果数据库是50G,则要另外还需要100G空间才能使用全库的闪回),因此目前在所有项目中都不使用,这里也不做介绍2)被drop掉的表能否闪回来与两个因素相关:1、该表所在表空间的大小有关,即如果表空间够大,用drop语句删除的表,并不是真正的从数据库中删除,而是把表改成BIN$开头的表,但是如果表空间不够大,在有新数据要存入该表空间的时候,就会覆盖这些BIN$表所暂的物理空间,此时也就没有办法利用闪回恢复该表了2、删除该表的时候是否用的purge,如果在drop的时候使用了purge,则该表就被从表空间中彻底的被删除了,如果要恢复,必须用以前的备份恢复3)被dml操作之后表数据能否闪回与下面两个因素的关系:1、undo_retention参数设置值UNDO_RETENTION参数用以控制事务提交以后UNDO信息保留的时间,UNDO信息可以用于一系列的闪回查询等操作,该参数以秒为单位.但是默认情况这是一个非担保性(NO Guaranteed)限制,也就是说,如果有其他事务需要回滚空间,而空间出现不足时,这些信息仍然会被覆盖。
2、undo表空间的大小闪回需要的数据都是存储在undo表空间中,保留多久是由undo_retention 参数设置值和表空间大小一起决定,在undo表空间足够大的情况下,可以闪回undo_retention参数设置保留时间之内的数据(例如:undo_retention参数设置了900,这可以闪回15分钟前的数据),但是如果undo表空间不够大,在undo 使用到100%的时候,这个时候如果有其他事务需要使用回滚段时,就会覆盖已经commit但是还没有过undo_retention保留时间的信息。
如何快速找回数据库表中误删除的数据如果Oracle10g数据库中误删除了一个表中的记录,例如删除了一个非常重要的雇员信息,并且该事务已经提交了,如何快速找回误删除的数据呢?这种情况下可以利用Oracle10g数据库的闪回功能实现找回丢失的数据。
具体的说就是行闪回。
行级闪回是指获取先前某个时间点或某个SCN值时表的行数据。
行级闪回有两种方式,一是闪回到某个时间点,二是闪回到某个SCN号。
实验如下:首先以SYS用户连接数据库,查询数据库是否开启了闪回功能。
SQL> select flashback_on from v$database;FLASHBACK_ON------------------NOSQL>如果没有开启闪回功能,则需要SHUTDOWN IMMEDIATE数据库,然后将数据库加载到MOUNT状态,使用ALTER DATABASE FLASHBACK ON 开启数据库闪回功能。
还需要设置参数db_flashback_retention_target。
实例如下:SQL> shutdown immediate;数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;ORACLE 例程已经启动。
Total System Global Area 289406976 bytesFixed Size 1248600 bytesVariable Size 92275368 bytesDatabase Buffers 192937984 bytesRedo Buffers 2945024 bytes数据库装载完毕。
SQL> select name,log_mode,open_mode,flashback_on from v$database;NAME LOG_MODE OPEN_MODE FLASHBACK_ON--------- ------------ ---------- ------------------MYORACLE ARCHIVELOG MOUNTED NOSQL> alter database flashback on;数据库已更改。
为什么使用闪回技术 (1)闪回技术的发展 (1)闪回查询Flashback Query (2)闪回表Flashback Table (2)闪回删除flashback drop (4)闪回版本查询 (5)闪回事务查询(主要利用undo_sql进行撤消操作) (6)闪回数据库flashback database (6)闪回数据归档 (7)为什么使用闪回技术在Oracle的操作过程中,会不可避免地出现操作失误或用户错误,例如删除了一个表等。
传统意义上的解决方法是使用数据导入导出,或是备份恢复技术,但是前提是必须在错误发生之前有正确的备份。
有了闪回技术,就可以实现数据的迅速恢复,而且不依赖于数据备份。
闪回技术的发展将表回滚到一个过去的时间点或系统改变号SCN上,用来快速恢复表。
Flashback Drop结合Oracle的回收站,将删除的对象从回收站中还原。
Flashback Version Query查看某个表在指定时间段或某两个SCN之间的修改操作。
Flashback Transaction Query结合闪回版本查询,查看某个对象的事务信息,该信息中记录了撤消SQL 语句,用于实现对该事务的撤消处理。
Flashback Database将数据库回滚到一个过去的时间点或系统改变号SCN,快速恢复数据库。
Flashback Data Archive将数据库对象的修改操作记录在闪回数据归档区域中,这样可以使得数据的闪回不依赖于UNDO撤消数据。
闪回查询Flashback Query允许对误删除、误更新等DML操作进行闪回(UNDO表空间读取操作前的记录数据)。
常用的sql:Select current_scn from v$database;Select count(*) from 表名 as of scn scn的值;--------查询Select count(*) from 表名 as of timestamp timestamp的值;--------查询Insert into 表名 Select * from 表名 as of scn scn的值; --------恢复数据的方法闪回表Flashback Table实际上就是将表中的数据快速恢复到过去的一个时间点或是系统改变号SCN上,实现表的闪回,需要使用到与undo表空间相关的undo信息,通过show parameter undo可以了解这些信息。
Oracle 10g更强大的回闪数据库功能【IT168 服务器学院】用一个简单的SQL语句将一个表或者整个数据库恢复到以前的某一点。
除夕之夜,Acme银行的数据库管理员(DBA)John正在和他的朋友们一起狂欢,倒计时迎接新的一年的到来。
就在子夜钟声敲响、人群欢呼之时,他的寻呼机突然响了。
在银行的数据中心,在年末进行利息累机批处理簿记过程中发生了错误,所有的利息计算都不准确。
幸好开发团队找出了错误所在,并开发一个应急纠正模块,但这一纠正模块不能恢复已经造成的破坏。
部门经理问John是否有什么方法能往回倒一些时间,将数据库恢复至该批处理开始之前的状态,该批处理大约是在晚上11:00开始的。
对于DBA们来说,这不是一件很熟悉的事吗?John的选择是什么呢?在Oracle数据库10g之前,John可能会做一个"时间点"恢复,来将数据库恢复至所希望的某一时刻的状态。
不幸的是,银行的定期日常备份大约就是在那个时间开始,这就意味着他将不得不用接近24小时的有价值的归案日志来恢复数据库。
Oracle9i数据库中提供的另一种选择是使用回闪查询特性来重建到晚上11:00为止的该表的各行,并手动生成一组不同的表。
这一方法尽管理论上可行,但如果表的数量很大,则会变得不切合实际。
幸运的是,John现在的数据库是Oracle数据库10g,所以他拥有更多的选择。
回闪表让我们来看一下上面的情况。
出问题的年末批处理可能仅影响少数表。
例如,它可能仅用新的账户结余更新了ACCOUNTS表。
如果确实是这种情况,则John可以使用回闪表特性,它会将一个表恢复到一个过去的时间点的状态。
执行回闪表操作不需要特殊的设置。
唯一的要求是表必须具有可移动的行--或者是在创建表时设置,或者是在以后利用ALTER TABLE ACCOUNTS ENABLE ROW MOVEMENT 语句设置。
FLASHBACK TABLE语句从撤消段中(undo segment)读取该表的过去映像,并利用Oracle9i中引入的回闪查询重建表行。
oracle 10g flashback 学习flashback:即回闪,是从oracle9i就开始提出的一种操作恢复的功能,在oracle10g中进行了增强和修改,通过回闪,用户可以完成许多不可能恢复的工作,目前oracle10g的回闪包括以下特性;1〉oracle falshback Database. 特性允许oracle通过Flashback database语句,将数据库会滚到前一个时间点或者scn上,而不需要作时间点的恢复工作!)(数据库级了!)2〉oracle falshback table. 特性允许oracle通过flashback table语句,将表会滚到前一个时间点或者scn上。
3〉oracle falshback drop. 特性允许oracle恢复被drop掉的table或者索引。
4〉oracle falshback version query. 特性可以得到特定的表在某一个时间段内的任何修改记录!(9i就具备的功能)5〉oracle falshback transaction query 特性可以限制用户在某一个事务级别上检查数据库的修改操作,适用于诊断问题、分析性能、审计事务。
一:oracle falshback tableoracle flashback table即回闪表可以进行的操作:操作1>flashback table tablename to befor drop;对于误drop的table此可以使用本操作,还原drop的table!此操作需要用户有以下的权限:A:falshback any table的系统权限或者是某一个表的flashback权限。
B:有table的select、insert、delect、alter权限。
C:有table的row Movement权限SQL> set serveroutput onSQL> set time on11:24:37 SQL> set feadback off;11:24:59 SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------B TABLESTEST TABLETA TABLEGROUPINGTEST TABLECOLTABLE TABLEROWTABLE TABLECOLTABLE1 TABLEROWTABLE1 TABLEA1 TABLEA TABLE----------------------可以看到本用户下有table A,现在drop它;-----------------------11:25:01 SQL> drop table a;11:26:18 SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------B TABLESTEST TABLETA TABLEGROUPINGTEST TABLECOLTABLE TABLEROWTABLE TABLECOLTABLE1 TABLEROWTABLE1 TABLEBIN$dFFlS6jJQLShRwRQ+kLJMg==$0 TABLEA1 TABLE----------------------table已经删除,可以看到table并不是真正意义上的删除掉了,而是多了一个"BIN$dFFlS6jJQLShRwRQ+kLJMg==$0"的表,这个表是原来的A表,这是oracle 的recyclebin,一个类似垃圾回收站的机制。
Oracle 9i的闪回查询概述1、Oracle 9i的闪回查询功能在Oracle 9i之前,如果用户错误操作数据后,除了不完全恢复外,没有好的解决办法。
Oracle 9i中提供闪回查询,由一个新的包DBMS_FLASH来实现。
用户使用闪回查询可以及时取得误操作DML(Delete、Update、Insert)前某一时间点数据库的映像视图,用户可以利用系统时间或系统改变号(SCN:System Change Number)来指定这个只读视图,并可以针对错误进行相应的恢复措施。
闪回查询功能完全依赖于自动回滚段管理(AUM),对于Drop等误操作不能恢复。
闪回特性可应用在以下方面:(1)自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复。
(2)恢复Email和声音Email:当用户意外删除了Email或者声音信息时,可以通过移回到固定时间点来恢复删除。
(3)账号平衡状况:可以查看以前的历史数据。
如银行外币管理中用于记录特定时间的汇率。
在以前,汇率变更被记录在一个历史表中,现在就可以通过闪回功能进行查询。
(4)用于趋势分析的决策支持系统:决策支持系统和联机分析应用必须执行一个长时间的事务。
使用闪回查询,这些应用可以对历史数据执行分析和建模。
例如,特定产品如矿泉水随季节变化需求情况的变化。
2、回滚段概述回滚段用于存放数据修改之前的位置和值,回滚段的头部包含正在使用的该回滚段事务的信息。
回滚段的作用如下:(1)事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务时,Oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
(2)事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,Oracle将在下次打开数据库时利用回滚来恢复未提交的数据。
(3)读一致性:当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。
第5章Oracle 10g的闪回机制5.1 简介在Oracle中,对于提交的变化,是没有办法回退的。
所以这时候就可能存在这样一种情况,对于表做了DML操作,并且在提交后才发现,对表的操作是错误的,此时我们没有办法把提交的错误数据回滚到初始的正确状态;同时,和可能存在一种情况,错误的对表执行了drop操作,由于DDL语句在执行后隐含的含有提交操作,所以这种情况也没有办法把执行了的错误DROP操作回滚的DROP语句执行前的状态。
对于第一种情况,在Oracle 9i版本若发现及时,可以通过dbms_flashback闪回,获取到执行错误操作前的数据,然后来执行修复。
但是,由于回滚段中的数据可能被覆盖掉,所以通过这种闪回就有个限制。
对于第二种情况,在Oracle 10g以前的各个版本,只能执行数据库的不完整修复才能消除引入的错误操作(DROP TABLE).下面介绍ORACLE 10G引入的闪回,10G引入的闪回更加灵活,提供的功能也更加强大。
10G引入的删除可分为4种:Flashback Database、Flashback Drop、Flashback Query、Flashback Versions Query、Flashback Transaction Query。
5.2 Flashback drop在10G以前的版本中,如果误操作DROP了某张表,那么只能采取数据库的不完整修复来做恢复数据库,但10g版本新增的这个特性,提供了一种对误DROP表的修复方式。
●先做一个简单实验的例子:先创建表create table t( a varchar2(30));模拟错误操作DROP表drop table t;此时闪回表flashback table t to before drop;闪回表T后,表T从误操作后恢复了,并且可以对表T做常规操作。
●Flashback drop table的原理:在较早的Oracle版本中,drop表时也会从数据字典中彻底删除对这个表的所有引用,恢复被drop 掉的表的唯一方法是执行时间点恢复。
而在10g的Oracle数据库中,drop table命令的实现已经发生变化:指定的表不再被删除,而是被重命名。
下面用个例子来说明:新建一个用户,授予必要的权限,本章的例子都在用户fox完成。
create user fox identified by sys default tablespace users;create user fox identified by sys default tablespace users;grant create session,create table,flashback any table,debug connect session,createtype,create view,create sequence to fox;alter user fox quota unlimited on users;以fox用户建测试表并插入一条记录,Create table test(a varchar2(4000));Insert into test(a) values(‘测试flashback drop table’);Commit;此时模拟误操作,drop表test:Drop table test;由于此用户目前只是创建了一个对象TEST,但是已经被drop掉。
但是我们查询SQL> Select count(*) from user_objects;COUNT(*)----------1还存在一个对象,查询出这个对象SQL> select object_name from user_objects;OBJECT_NAME-------------------------------------------BIN$6PH8zhiWR7yzokLGBvg49A==$0现在来确定下。
“BIN$6PH8zhiWR7yzokLGBvg49A==$0”是个什么对象。
SQL> select * from "BIN$H+Wwg3weRqSSlBI3UJOKbg==$0";查询结果是A------------------------------------------------------测试flashback drop table此实验证实了我们开始drop的表test,实际上并没有被物理删除,只是被系统自动重新命名了。
恢复表flashback table test to before drop;●Oracle的“回收站”参数RECYCLEBIN(值为ON或者OFF)用来控制是否开启数据库的flashback drop 特性。
当此参数值设为OFF时,drop table时不会把表放进“回收站”,而是直接drop掉。
当此参数值设为ON时,drop table是会把表放进“回收站”,并可以通过flashback drop特性来修复。
下面在以表test为例来说明:SQL> drop table test;SQL> select a.object_name, a.original_name2 from recyclebin a, user_objects b3 where a.object_name = b.object_name;OBJECT_NAME ORIGINAL_NAME------------------------------ ------------------BIN$/WDtTeRnQ3io2IQh/yZNJA==$0 TESTSQL> select a from "BIN$/WDtTeRnQ3io2IQh/yZNJA==$0";A-----------------------------------------------------测试flashback drop table通过查询“回收站”视图,可以知道表TEST在被DROP后,被系统自动重命名为“BIN$/WDtTeRnQ3io2IQh/yZNJA==$0”。
●管理“回收站”通过purge来管理清理“回收站”中的内容,。
语法:PURGE {TABLE <table_name>|INDEX <index_name>}解释:清理“回收站”中指定的表或索引语法:PURGE TABLESPACE <ts_name> [USER <user_name>]解释:清理“回收站”中存储在指定表空间的上的对象(或指定用户的对象)语法:PURGE [USER_|DBA_]RECYCLEBIN解释:清理“回收站”中当前用户或者所有数据库内的对象。
关于回收站的重要视图:select * from RECYCLEBIN;select * from dba_recyclebin;select * from user_recyclebin;从“回收站”Flashback drop时符合先进后出用一个简单的例子来说明,并介绍flashback drop时直接重命名对象。
SQL> create table tt (a varchar2(300));表已创建。
SQL> insert into tt(a) values('先被DROP 到回收站');已创建1 行。
SQL> commit;提交完成。
SQL> drop table tt;表已删除。
SQL> create table tt( b varchar2(200));表已创建。
SQL> insert into tt (b) values('第2个被drop到回收站');已创建1 行。
SQL> commit;提交完成。
SQL> drop table tt;表已删除。
SQL> flashback table tt to before drop;闪回完成。
SQL> select * from tt;B---------------------------------------------------------------------------- 第2个被drop到回收站SQL> flashback table tt to before drop;flashback table tt to before drop*第1 行出现错误:ORA-38312: 原始名称已被现有对象使用SQL> flashback table tt to before drop rename to new_tt;闪回完成。
SQL> select * from new_tt;A-------------------------------------------------------------------------先被DROP 到回收站从上面的例子,简单总结如下:flashback drop在恢复同名的表时,先被drop放到“回收站”的对象最后被恢复;flashback drop时,可以重新命名对象。
使用限制,满足下面任何一条,被drop掉的表,都不能被闪回了:被drop掉的表不能存储在system表空间上;被drop掉的表不能存储在数据字典管理的表空间上;被drop掉的表还存储在“回收站”中,没有被purge掉。
5.3 Flashback Query通过一个简单例子,来了解flashback query的特性SQL> create table flash_query as2 select t.object_id,t.object_name3 from user_objects t;表已创建。
SQL> select object_id id ,object_name n from flash_query;ID N-------------------52888 BIN$/WDtTeRnQ3io2IQh/yZNJA==$052889 NEW_TT52890 TT52892 BIN$gQZY1MJ3RPu7SB7n2bqGYA==$052893 FLASH_QUERYSQL> select to_char(sysdate,'yyyymmddhh24miss') s from dual;s--------------20080904220843SQL> update flash_query set object_name='error';已更新5行。