首页 > 数据库 > Oracle > 整理有关Flashback的相关资料
|
闪回功能 |
使用条件 |
|
Flashback query |
Undo采用自动管理 |
|
Flashback Version query |
Undo采用自动管理 |
|
Flashback transaction query |
1.Undo采用自动管理 |
|
Flashback table |
方法一、开启recyclebin(默认开启),适用于drop table后的恢复 |
|
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;Delete Flash_tbl where id<10;
Commit;
假设5分钟后,发现用户发现误删了数据,则可以通过如下语句查出5分钟前,flashback_tbl中的记录
Select * from flashback_tbl as of timestamp sysdate-5/1440
获取数据库当前的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/分区)是不能使用闪回查询
适用于查看一段时间内某一对象多次修改的记录
语法格式: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 |
该条记录操作时的SCN或时间,如果为空,表示该行记录是在查询范围外创建的 |
|
VERSIONS_ENDSCN |
该条记录失效时的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查询
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 |
|
适用于不小心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;
备注:如果删除分区表的某一分区,则无法通过此方法恢复已删除的分区。
适用于处理的表不是被意外删除,而是被反复修改,希望回到某个时间点
Flashback语句:Flashback table Flash_tbl to scn 1666152
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30158401/viewspace-1465794/ ,如需转载,请注明出处,否则将追究法律责任。