ITPub博客

首页 > 数据库 > Oracle > 整理有关Flashback的相关资料

整理有关Flashback的相关资料

Oracle 作者:heibao326 时间:2015-03-19 12:34:56 0 删除 编辑

简单概括

闪回功能

使用条件

Flashback query

Undo采用自动管理

Flashback Version query

Undo采用自动管理

Flashback transaction query

1.Undo采用自动管理
2.
开启补充日志alter database add supplemental log data(默认不开启,一般不开启)

Flashback table

方法一、开启recyclebin(默认开启),适用于drop table后的恢复
方法二、从undo表空间中恢复,对table开启行迁移alter table table enable row movement(默认不开启)

Flashback database

开启闪回区Flashback Recovery Area




















先创建一张表,以下示例均以这张表为例

Create  table  flash_tbl(id,vl) as select  rownum,oname from (select

substr(object_name,1,1)  oname  from all_objects

 group by  substr(object_name,1,1)  order by 1)

where rownum<=20;

一、 Flashback Query

1.1基于时间的查询

Delete Flash_tbl  where id<10;

Commit;

假设5分钟后,发现用户发现误删了数据,则可以通过如下语句查出5分钟前,flashback_tbl中的记录

Select  *  from flashback_tbl as of timestamp sysdate-5/1440

 

1.2基于SCN的查询

获取数据库当前的SCN号

方法一:通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数,此时需给用户分配权限(grant execute on DBMS_FLASHBACK TO scott;)

方法二:查询V$DATABASE中的CURRENT_SCN列,此时需给用户分配权限(grant  select on v_$database to scott);

删除前查询下数据库的SCN号

Select dbms_flashback.get_system_change_number from dual;

----------------------------

1613083

Delete Flash_tbl  where id<10;

Commit;

此时可以通过指定SCN号来进行SCN=1613083时资料的查询

SELECT * FROM FLASH_TBL  AS OF SCN 1613083;

 

备注:1.  Flashback query 不会更改数据,只是显示某个时间点上表中的数据

      2.使用SCN查询会比TIMESTAMP 更精确,实际上指定TIMESTAMP查询,Oracle也是将其转换成SCN。具体转换规则是通过SYS.SMON_SCN_TIME实现的,可以通过两个函数进行转换

Select timestamp_to_scn(sysdate) from dual

Select  to_char(SCN_TO_TIMESTAMP(1613168),’yyyy-mm-dd’) from dual

      3.并非可以查询到任何时间点的数据,需受undo_retention和undo空间大小限制。

      4.如果更改表结构(drop/modify 列、move表、drop分区、

Truncate Table/分区)是不能使用闪回查询



一、 FLASHBACK Version Query

适用于查看一段时间内某一对象多次修改的记录

语法格式:SELECT ID,VL,VERSIONS_STARTSCN,

VERSIONS_ENDSCN,VERSIONS_OPERATION,VERSIONS_XID FROM FLASH_TBL VERSIONS BETWEEN SCN 1613083 AND 1613819;

备注:Flashback Query 中Version Query的伪列说明

VERSIONS_STARTSCN
VERSIONS_STARTTIME

该条记录操作时的SCN或时间,如果为空,表示该行记录是在查询范围外创建的

VERSIONS_ENDSCN
VERSIONS_ENDTIME

该条记录失效时的SCN或时间,如果为空,说明记录当前时间在当前表内部存在,或者已经被删除,可以配合着VERSION_OPERATION列来看,如果VERSION_OPERATION列值为D,说明该列已被删除;如果该列为空,则说明记录在这段时间无操作

VERSIONS_XID

该操作的事务ID

VERSIONS_OPERATION

对该行执行的操作:I表示INSERT,D表示DELETE,U表示UPDATE


假设上述SQL查询出的结果如下,解释如下

ID

VL

VERSIONS_STARTSCN

VERSIONS_ENDSCN

VERSIONS_OPERATION

VERSIONS_XID

含义

201

A1

1636927

 

I

05000C0029050000

在SCN=1636927时insert,至现在还有效

4

C

1636904

 

D

06001300D7050000

记录在SCN=1636904时被删除

3

B

1636904

 

D

06001300D7050000

记录在SCN=1636904时被删除

2

A

1636904

 

D

06001300D7050000

记录在SCN=1636904时被删除

1

/

1636904

 

D

06001300D7050000

记录在SCN=1636904时被删除

120

S

1636892

 

U

400120077040000

记录在SCN=1636892时被更新,至现在还有效

119

R

1636892

 

U

400120077040000

记录在SCN=1636892时被更新,至现在还有效

118

Q

1636892

 

U

400120077040000

记录在SCN=1636892时被更新,至现在还有效

117

P

1636892

 

U

400120077040000

记录在SCN=1636892时被更新,至现在还有效

116

O

1636892

 

U

400120077040000

记录在SCN=1636892时被更新,至现在还有效

1

/

 

1636904

 

 

记录在SCN=1636904失效

2

A

 

1636904

 

 

记录在SCN=1636904失效

3

B

 

1636904

 

 

记录在SCN=1636904失效

4

C

 

1636904

 

 

记录在SCN=1636904失效

5

D

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

6

E

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

7

F

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

8

G

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

9

H

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

10

I

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

11

J

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

12

K

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

13

L

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

14

M

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

15

N

 

 

 

 

记录在SCN范围外创建,至现在未有任何操作,还有效

16

O

 

1636892

 

 

记录在SCN=1636892失效

17

P

 

1636892

 

 

记录在SCN=1636892失效

18

Q

 

1636892

 

 

记录在SCN=1636892失效

19

R

 

1636892

 

 

记录在SCN=1636892失效

20

S

 

1636892

 

 

记录在SCN=1636892失效


一、 使用FLASHBACK Transaction Query

    查询某表修改记录,并给出回滚SQL,但不能查看当时修改的SQL,只能通过回滚SQL猜测。

   示例如下

 delete flash_tbl where id = 401;

从FLASHBACK_TRANSACTION_QUERY查询

 

  select xid, commit_scn, commit_timestamp, operation, undo_sql

    from flashback_transaction_query q

   where q.xid in

         (select versions_xid

            from flash_tbl versions between scn 1643896 and 1643905)

XID

COMMIT_SCN

COMMIT_TIMESTAMP

OPERATION

UNDO_SQL

06000D00D9050000

1643902

2015/3/19 9:51

DELETE

insert into "XXCARA"."FLASH_TBL"("ID","VL") values ('401','A1');

06000D00D9050000

1643902

2015/3/19 9:51

BEGIN

 



一、 Flashback  Table

4.1 从Recycle bin中恢复

    适用于不小心drop 掉table的情形

   简单示例如下

   Drop table flash_tbl;

   可以从recycle bin中查询到

   select * from recyclebin where original_NAME='FLASH_TBL';

  我们可以直接利用以下语句直接闪回

   Flashback table flash_tbl to before drop;

  复杂示例如下

  情景一:待闪回的表名(例flash_tbl)在数据库中已又有了相同名字的表,这时候需要对待闪回的表进行rename

  Flashback  table  flash_tbl  to before  drop rename to flash_tbl_new;

  情景二:多个同名对象均被删除多次,默认情况下是最先删除的表最先被恢复,但是我们可以通过指定Recycle Bin中的对象名来恢复

  Flashback table “BIN$EZwIUFv2DOXgUwEAAH+rmg==$0”  to before drop;

 备注:如果删除分区表的某一分区,则无法通过此方法恢复已删除的分区。

4.2 从UNDO中恢复

适用于处理的表不是被意外删除,而是被反复修改,希望回到某个时间点

Flashback语句:Flashback table Flash_tbl to scn  1666152

 

五、闪回数据库

有关闪回数据库部分暂不整理


文章整理自《涂抹Oracle》,转载出处:http://wenku.it168.com/d_000051507.shtml 






来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30158401/viewspace-1465794/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-03-10

  • 博文量
    11
  • 访问量
    74747