flashback query追溯数据块的原理
- 格式:pdf
- 大小:134.69 KB
- 文档页数:8
OracleFlashback详解 Oracle flashback 是⼀种⽅便快捷的数据库恢复技术,它不使⽤备份⽂件,通过闪回⽇志可以使数据库恢复到过去的某个状态,当⽤户发⽣逻辑错误时(误删表数据、表、表空间等)需要快速恢复数据库,可以使⽤Flashback 实现。
1 启⽤Flashback 数据库 Oracle 默认不启动flashback 数据库,使⽤flashback 技术必须先启动数据库到flashback 状态,且数据库必须处于archive 模式下,并启⽤闪回恢复区,因为闪回⽇志⽂件必须存放在闪回恢复区中。
1) 检查数据库的归档状态SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 4Next log sequence to archive 6Current log sequence 6SQL>如果数据库没有启动到归档模式,需要⼿动启动到模式下。
SQL> shutdown immediateSQL> startup mountSQL> alter database archivelog2) 确定闪回恢复区的⽬录SQL> show parameter DB_RECOVERY_FILE_DEST;NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string /usr/oracle/app/flash_recovery_areadb_recovery_file_dest_size big integer 3882M3) 查看并设置db_flashback_retention_target参数该参数是⼀个以分为单位的数字,默认为1440分钟,表⽰从当前开始计算最⼤可以把数据库闪回到过去的时间。
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,一个类似垃圾回收站的机制。
闪回数据归档(FlashbackDataArchive)17.8 闪回数据归档(Flashback Data Archive)在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档进行介绍。
17.8.1 闪回数据归档概念在这里让我们从Oracle 9i开始引进的Flashback Query说起,这是Oracle第一次引入闪回技术,该技术使得一些逻辑误操作不再需要利用归档日志和数据库备份进行时间点恢复。
而在Oracle 10g当中,更是引入flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性,大大简化了Flashback Query的使用。
在上面的诸多闪回技术当中,除了Flashback Database(依赖于闪回日志)之外,其他的闪回技术都是依赖于Undo撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关(该参数决定了撤销数据在数据库中的保存时间)。
它们是从撤销数据中读取信息来构造旧数据的。
这样就有一个限制,就是undo中的信息不能被覆盖。
而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace 快速膨胀。
Oracle 11g则为flashback家族又带来一个新的成员:Flashback Data Archive。
该技术与以上所说的诸多闪回技术的实现机制不同,通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。
Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的。
这个功能有很大的限制,就是相关事务的undo不能被覆盖,否则就无力回天了。
oracle10g大大的增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。
flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。
为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area)的新特性,可以将所有恢复相关的文件,比如flashback log,archive log,backup set等,放到这个区域集中管理。
1.设置闪回恢复区闪回恢复区主要通过3个初始化参数来设置和管理db_recovery_file_dest:指定闪回恢复区的位置db_recovery_file_dest_size:指定闪回恢复区的可用空间大小db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。
当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。
所以这个参数要和db_recovery_file_dest_size配合修改。
2.启动flashback database设置了闪回恢复区后,可以启动闪回数据库功能。
首先,数据库必须已经处于归档模式那么如何设置归档呢?很简单的步骤1.关闭数据库SQL> shutdown immediate;2.启动数据库为mount模式SQL> startup mount3.显示和修改归档模式SQL> archive log listSQL> alter database archivelog;SQL> alter database open4.设置归档日志的格式SQL>alter system set log_archive_format='ARC%s%t%r.log' scope=spfile;5.设置归档日志的存放路径SQL>alter system set log_archive_dest='+data/arcl' scope=spfile;SQL>shutdown immediateSQL>startup6.强制切换归档日至SQL>alter system switch logfile;7.取消归档SQL>alter database noarchivelog;参数1.格式参数%s 日志序列号%S 日志序列号(带前导的0)%t 重做线程编号%a 活动的ID号%d 数据库ID号%r RESELOGS的iD值SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 156Next log sequence to archive 158Current log sequence 158然后,启动数据库到mount状态SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 285212672 bytesFixed Size 1218992 bytesVariable Size 75499088 bytesDatabase Buffers 205520896 bytesRedo Buffers 2973696 bytesDatabase mounted.SQL>alter database flashback on;数据库已更改。
在Oracl e中使用Flashback在Oracle 9i/10g中使用Flashback一、Flashback的概念在Oracle 9i数据库中,提出了数据闪回〔Flashback〕的概念。
使用Flashback,可以在不对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。
所谓Flashback就是使数据库中的实体显示或回到过去的某一时间点,这样可以实现对历史数据的恢复。
二、在Oracle 9i中使用Flashback? ? ?在Oracle 9i中使用包DBMS_FLASHBACK来提供闪回功能。
如果需要用到闪回查询,必须在init.ora或者是spfile.ora中设置以下参数undo_management = auto 〔默认〕此外,参数undo_retention = n〔秒〕,它决定了能往前闪回的最大时间〔Undo 最多的保存时间〕,越大的值,就会需要更多的Undo空间的支持。
SQL> show parameter autoSQL> alter system set undo_retention=1200; 〔Undo信息将保持1200秒=20分钟〕注意:Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。
如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间。
Oracle 9i的Flashback有如下限制。
? 采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。
? 不能flashback 5天以前的数据,这个并不是undo_retention所能决定的。
? 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
在Oracle数据库中,闪回(Flashback)是一种用于恢复数据库到特定时间点的功能。
它允许您撤销数据库更改,并返回到过去的状态。
通过使用闪回语法,您可以轻松地恢复丢失的数据或解决数据不一致问题。
闪回语法的基本格式如下:```scssFLASHBACK table_name TO TIMESTAMP;```其中,`table_name`是要执行闪回操作的表名,`TIMESTAMP`是要返回到的时间戳。
时间戳可以是日期时间值,也可以是系统保留的关键字,如`SYSDATE-1`表示返回到一分钟前的时间状态。
以下是使用闪回语法的一些常见场景和用法:1. 恢复丢失的数据:如果您不小心删除了某个表中的数据,可以使用闪回语法将其恢复到删除之前的状态。
例如:```sqlFLASHBACK table_name TO SYSDATE;```这将返回到表被删除之前的时间状态。
2. 解决数据不一致问题:如果您发现某个表中的数据不一致,可以使用闪回语法将其恢复到一致的状态。
例如,如果您发现某个事务导致数据发生了错误更改,可以使用闪回语法将表返回到事务开始之前的状态。
3. 历史数据查询:如果您需要查询历史数据,可以使用闪回表(Flashback Table)功能。
通过将表设置为闪回表,您可以查询过去的时间戳数据,而无需创建额外的历史表。
4. 数据备份恢复:如果您需要备份数据库并恢复到过去的时间点,可以使用闪回数据库(Flashback Database)功能。
这将整个数据库视为一个单独的逻辑对象,并提供对过去时间和数据点的访问权限。
需要注意的是,使用闪回语法需要满足一些前提条件,例如表必须具有可回滚的物化视图或物化视图刷新日志(MMMF)的约束。
此外,某些表类型(如分区表)可能需要额外的设置才能使用闪回语法。
总之,闪回语法是Oracle数据库中一个非常有用的功能,它可以帮助您轻松地恢复丢失的数据、解决数据不一致问题以及进行历史数据查询。
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)读一致性:当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。
今天配合应用查数据,通过flashback query来找出某条数据被删除的时间点。
后来就产生了一个疑问:flashback query是通过从undo表空间中查询事务的前镜像来找出先前的数据,那么该怎么从undo中找到我们要的数据呢。
打个比方,我们在时间点t1删除了表tab中id=10的记录,然后在时间点t2,我们来做闪回查询,select * from tab as of timestamp t1 where id=10这个查询如何找到被删除的那条记录的rowid,或是其他可以定义它的信息,进而在undo中查到它的前镜像呢?我们来整理一下。
FLASHBACK_TRANSACTION_QUERY视图中保存了事务的一些相关信息,它是基于x$ktuqqry基表。
包含的字段和注释如下:create or replace view sys.flashback_transaction_query asselect xid, start_scn, start_timestamp,decode(commit_scn, 0, commit_scn, 281474976710655, NULL, commit_scn)commit_scn, commit_timestamp,logon_user, undo_change#, operation, table_name, table_owner,row_id, undo_sqlfrom sys.x$ktuqqry;comment on table SYS.FLASHBACK_TRANSACTION_QUERY is 'Description of the flashback transaction query view';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.XID is 'Transaction identifier';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.START_SCN is 'Transaction start SCN';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.START_TIMESTAMP is 'Transaction start timestamp';comment on column SYS.FLASHBACK_TRANSACTION_MIT_SCN is 'Transaction commit SCN';comment on column SYS.FLASHBACK_TRANSACTION_MIT_TIMESTAMP is 'Transaction commit timestamp'; comment on column SYS.FLASHBACK_TRANSACTION_QUERY.LOGON_USER is 'Logon user for transaction';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.UNDO_CHANGE# is '1-based undo change number';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.OPERATION is 'forward operation for this undo';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.TABLE_NAME is 'table name to which this undo applies'; comment on column SYS.FLASHBACK_TRANSACTION_QUERY.TABLE_OWNER is 'owner of table to which this undo applies'; comment on column SYS.FLASHBACK_TRANSACTION_QUERY.ROW_ID is 'rowid to which this undo applies';comment on column SYS.FLASHBACK_TRANSACTION_QUERY.UNDO_SQL is 'SQL corresponding to this undo';从中我们可以得到一些线索,versions_xid代表不同版本的事务id,是定位undo数据的一个重要依据。
该表信息量很大,可以作为logminer的某种替代方案,可惜这张表很大,效率很低难以查询。
通过versions between可以查询表中事务的一些相关信息:VERSIONS_STARTTIME (start timestamp of version);VERSIONS_STARTSCN (start SCN of version);VERSIONS_ENDTIME (end timestamp of version);VERSIONS_ENDSCN (end SCN of version);VERSIONS_XID (transaction ID of version);VERSIONS_OPERATION (DML operation of version);用法如:SELECT VERSIONS_XID FROM TTTAAA VERSIONS BETWEEN SCN 86971997 and回到最初的问题,如果根据业务表到undo中取查找我们想要的数据呢?我们来做一个测试:先创建一张测试表SQL> create table test_undo as select rownum a,'abctest'||rownum b from dual connect by rownum<1000000; Table createdSQL> select t.CURRENT_SCN from v$database t;CURRENT_SCN-----------90927919删除部分数据SQL> delete from test_undo where a between 1000 and 1100;101 rows deletedSQL> commit;Commit completeSQL> select t.CURRENT_SCN from v$database t;CURRENT_SCN-----------90928027SQL> set autotrace on使用flashback query来查看删除前的记录,走的是全表扫描SQL> select * from test_undo as of scn 90927919 where a=1005;A----------B--------------------------------------------------------------------------------1005abctest1005----------------------------------------------------------Plan hash value: 2632570078-------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2751 | 102K| 3374 (1)| 00:00:41 ||* 1 | TABLE ACCESS FULL| TEST_UNDO | 2751 | 102K| 3374 (1)| 00:00:41 |-------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("A"=1005)Statistics----------------------------------------------------------4 recursive calls0 db block gets 3321 consistent gets0 physical reads 0 redo size 238 bytes sent via SQL*Net to client346 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed我们在条件字段上创建一条索引SQL> create index idx_testundo_a on test_undo(a);Index created.然而优化器并不认账,在查询删除前的记录,还是全表扫描SQL> select * from test_undo as of scn 90927919 where a=1006;A ----------B --------------------------------------------------------------------------------1006 abctest1006Execution Plan----------------------------------------------------------Plan hash value: 2632570078-------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2751 | 102K| 3374 (1)| 00:00:41 ||* 1 | TABLE ACCESS FULL| TEST_UNDO | 2751 | 102K| 3374 (1)| 00:00:41 |-------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("A"=1006)Statistics----------------------------------------------------------1 recursive calls0 db block gets3314 consistent gets0 physical reads0 redo size 254 bytes sent via SQL*Net to client346 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedSQL> select t.CURRENT_SCN from v$database t;CURRENT_SCN -----------90932598再删除几条记录SQL> delete from test_undo where a between 1200 and 1300;101 rows deleted.SQL> commit;Commit complete.闪回查询,这次走了索引SQL> select * from test_undo as of scn 90932598 where a=1206;A----------B--------------------------------------------------------------------------------1206abctest1206Execution Plan----------------------------------------------------------Plan hash value: 3791186225---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2751 | 102K| 17 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TEST_UNDO | 2751 | 102K| 17 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IDX_TESTUNDO_A | 1100 | | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("A"=1206)Statistics----------------------------------------------------------1 recursive calls0 db block gets0 physical reads0 redo size254 bytes sent via SQL*Net to client346 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed还是闪回查询这几条记录,不同的是,选择的scn在索引创建之前,我们发现,走了全表扫描SQL> select * from test_undo as of scn 90927919 where a=1206;A ----------B --------------------------------------------------------------------------------1206 abctest1206Execution Plan----------------------------------------------------------Plan hash value: 2632570078-------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2751 | 102K| 3374 (1)| 00:00:41 ||* 1 | TABLE ACCESS FULL| TEST_UNDO | 2751 | 102K| 3374 (1)| 00:00:41 |-------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("A"=1206)Statistics----------------------------------------------------------1 recursive calls0 db block gets3314 consistent gets0 physical reads255 bytes sent via SQL*Net to client346 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedSQL> spool off可以认为,在闪回查询时,Oracle进行了一致性检查,若闪回查询的scn在索引创建以前,则会禁用索引扫描。