oracle flashback usage

今天首先介绍基于版本闪回的查询,这个功能其实和之前介绍的闪回查询类似,10G以后的版本都支持,也是以select语句的形式调用,需要在后面加上VERSIONS BETWEEN TIMESTAMP[/SCN] START AND END子句。
VERSIONS_STARTSCN,VERSIONS_STARTTIME 该条记录操作时的SCN或时间,如果为空,表示该行记录是在查询范围外创建的
VERSIONS_ENDSCN,VERSIONS_ENDTIME 该条记录失效时的SCN或时间,如果为空,说明记录当前时间在当前表内不存在,或者已经被删除了,可以配合着VERSIONS_OPERATION列来看,如果VERSIONS_OPERATION列值为D,说明该列已被删除,如果该列为空,则说明记录在这段时间无操作
VERSIONS_XID 该操作的事务ID
VERSIONS_OPERATION 对该行执行的操作:I表示INSERT,D表示DELETE,U表示UPDATE(注意:对于索引键的update操作,版本查询可能会将其识别成两个操作:DELETE和INSERT)
举例:
SQL> create table flash_version as select * from user_objects;
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
122693629913

SQL> update flash_version set object_id=object_id+100;

1 row updated.

SQL> commit;

Commit complete.

SQL> delete from flash_version;

1 row deleted.

SQL> commit;

Commit complete.

SQL> insert into flash_version select * from user_objects where rownum<2;

1 row created.

SQL> commit;

Commit complete.

SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
122693629931

SQL> SELECT VERSIONS_STARTSCN,VERSIONS_ENDSCN,VERSIONS_OPERATION, VERSIONS_XID FROM flash_version versions between scn 122693629913 and 122693629931;

VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID
-------------------- -------------------- - ----------------
122693629929 I 14001300C7F70900
122693629925 D 18002200B69E0100

VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID
-------------------- -------------------- - ----------------
122693629920 122693629925 U 1900130089AE0100
122693629920
由此可以看到每个SCN是什么操作,根据对应的SCN,那么就可以闪回到某一个特定的SCN。
flashback query条件:要使用该功能,那么必须启用自动撤销管理表空间。
undo_management string AUTO --就是这个参数,不过从9I这个都是默认的

flashback table使用:其实就是误删了表以后,想再找回该表
条件:除了之前的flashback query条件以外,还需要打开recyclebin,也就是大家熟悉的回收站,有点类似windows下面的那个回收站举例:
SQL> show parameter recyclebin;

NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
recyclebin string onSQL> select table_name from user_tables;

TABLE_NAME
------------------------------
TB1

SQL> drop table tb1;

Table dropped.
SQL> SELECT OBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME from RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME
------------------------------ -------------------------------- ------------------------- -------------------
BIN$2u57wKmp6GHgQKjAIgF10w==$0 TB1 TABLE 2013-04-22:15:23:37

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
FLASH_VERSION
TBL_ORACLE_FDW

SQL> flashback table tb1 to before drop;

Flashback complete.

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
TB1
FLASH_VERSION
TBL_ORACLE_FDW
这里有一个注意的是如果删除的表中有索引,那么这个索引恢复以后,名字还是recyclebin中的名字,这个是为了避免名字冲突,所以恢复以后可以用alter index "xxxxxxxxxxx" rename to xxxx;

已经存在表的恢复:
SQL> drop table tb1;

Table dropped.

SQL> create table tb1 (a number(10));

Table created.

SQL> SELECT OBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME from RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME
------------------------------ -------------------------------- ------------------------- -------------------
BIN$2u57wKmq6GHgQKjAIgF10w==$0 TB1 TABLE 2013-04-22:15:31:00

SQL> flashback table tb1 to before drop;
flashback table tb1 to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object


SQL> flashback table tb1 to before drop rename to tb2;

Flashback complete.
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
TB2
FLASH_VERSION
TB1
还可以从多次删除中恢复:这里不再举例,理解即可,通过一下命令即可指定恢复某一个删除的表
FLASHBACK TABLE "BIN$2u57wKmp6GHgQKjAIgF10w==$0" TO BEFORE DROP;

另外flashback table 还支持从undo中恢复数据,使用起来和之前介绍的flashback query类似:
使用起来很简单,如之前的:select * from tb1 as of scn/timestamp xxx; 替换为 flashback table tb1 to scn/timestamp xxx;
当然这有一个好处就是比如要恢复一个做过复杂更新或者删除的表,flashback table当然是首选,如果用flash query,那么需要分别判断修改的记录并做不同的处理。

注意点:
基于UNDO的恢复,需要表ENABLE ROW MOVEMENT,这个属性用来控制是否允许修改的列值所造成的记录移动。如果是disable状态,那么记录列值有移动操作时,更新语句会触发ORA-08189错误。可以通过查询USER_TABLES的ROW_MOVEMENT查看属性。
ALTER TABLE xxxxxx ENABLE/DISABLE ROW MOVEMENT;--通过该语句修改属性
基于RECYCELBIN恢复需要注意,表空间为本地管理表空间,不能恢复系统表空间删除的表,这点一定要注意,如果有基于该表的物化视图,需要重新创建,注意truncate的表是无法通过该特性恢复,flashback table 支持多表操作,逗号分隔,一个flashback table是一个事物,所以要么全失败,要么全部成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值