oracle闪回特性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle闪回特性相关的知识,希望对你有一定的参考价值。

oracle闪回特性

目录结构

一、说明
1.1、相关视图介绍
1.2 oracle闪回特性常用的有
1.3 oracle闪回特性常用的有
1.4、闪回表的注意事项
1.5、创建测试数据
1.6、闪回表

二、Using Oracle Flashback Query (SELECT AS OF)
2.1、Using Oracle Flashback Query (SELECT AS OF)
2.2、闪回查询语法
2.3、闪回查询的例子

三、Oracle Flashback Version Query
3.1、说明
3.2、语法
3.3、使用闪回版本查询和闪回查询恢复数据(闪回到插入数据前的状态)

四、Using Oracle Flashback Transaction Query
4.1、闪回事务查询说明
4.2、语法
4.3、闪回版本查询和闪回事务查询联合应用恢复表修改的事务

五、闪回drop
5.1 闪回drop说明
5.2 oracle的recycle bin是什么
5.3 查询recycle bin中的对象
5.4 清除recycle bin中的对象
5.5 从recycle bin中恢复表
5.6 从回收站中恢复表依赖的对象

六、闪回数据库
6.1 数据库闪回说明
6.2 开启数据库闪回功能
6.3 数据库闪回的例子
6.4、查询闪回状态

一、说明
1.1 相关视图介绍
dba_recyclebin 显示数据库里面回收站的信息
owner 对象的属主
object_name 回收站里对象名字
original_name 对象最初的名字
operation 对象执行的操作
drop- 对象被删除
truncate-对象被截断
注意oracle仅仅支持恢复drop的对象,不支持执行truncate的的对象。
type ■ TABLE
■ NORMAL INDEX
■ BITMAP INDEX
■ NESTED TABLE
■ LOB
■ LOB INDEX
■ DOMAIN INDEX
■ IOT TOP INDEX
■ IOT OVERFLOW SEGMENT
■ IOT MAPPING TABLE
■ TRIGGER
■ CONSTRAINT
■ Table Partition
■ Table Composite Partition
■ Index Partition
■ Index Composite Partition
■ LOB Partition
■ LOB Composite Partitio
ts_name 表示对象属于哪个表空间
createtime 创建对象时的timestamp
droptime 删除对象时的timstamp
DROPSCN 对象被移动到回收站时事务的scn号
PARTITION_NAME 被drop的分区名
CAN_UNDROP 表明该对象是否可以被undrop
CAN_PURGE 表明该对象是否能被清除
RELATED 父对象的对象号
BASE_OBJECT 基本对象的对象号
PURGE_OBJECT 被清除对象的对象号
SPACE 该对象使用多少个数据块

  flashback_transaction_query
    xid                     事务的标识id
    start_scn               事务启动的system change number
    start_timestamp         事务启动的时间截
    commit_scn              事务提交的system change number;null表示活动的事务
    commit_timestamp        事务提交的时间截;null表示活动的事务
    logon_user              哪个登录用户发起的事务
    undo_change#            undo的系统改变号1或者更高
    operation               事务执行的dml操作,D=delete,I=insert,u=update
    table_name              DML操作应用的表
    table_owner             dml操作应用表的属主
    row_id                  dml操作修改的rowid
    undo_sql                sql到undo上的撤销操作。

1.2 oracle闪回特性常用的有
     flashback drop,flashback query,flashback versions query,flashback transaction,flashback table,flashback database;

1.3、闪回表的说明
? 使用闪回表,可将一个或多个表还原到特定时间点,而不需要还原备份。
? 将从还原表空间检索数据来执行闪回表操作。
? 您需要具有对特定表的 FLASHBACK ANY TABLE 或FLASHBACK 对象权限。
? 需要对要闪回的表具有 SELECT、INSERT、DELETE、和 ALTER 权限。
? 必须对要执行闪回操作的表启用行移动

1.4、闪回表的注意事项
? FLASHBACK TABLE 命令作为单个事务处理执行,要求获取 DML 排它锁。
? 不闪回统计信息。
? 保留当前索引和从属对象。
? 闪回表操作:
    – 不能对系统表执行
    – 不能跨 DDL 操作
    – 会生成还原和重做数据

1.5、创建测试数据

SQL> create tablespace zx datafile size 10m;

Tablespace created.

SQL> create temporary tablespace ts_zx tempfile size 10m;

Tablespace created.

SQL> create user zx identified by dhhz default tablespace zx temporary tablespace ts_zx;

User created.

SQL> grant connect,resource to zx;

Grant succeeded.

SQL> grant connect,resource,select any dictionary to zx;

Grant succeeded.

1.6、闪回表(闪回表中delete的数据)

1、闪回表的说明及特性
1、闪回表允许我们将数据表恢复到过去的某个时间点或者scn
2、自动恢复相关属性、如索引、触发器、约束
3、flashback table 不能将表恢复到改变表结构的ddl操作之前。

2 闪回表的语法
alter table table_name enable row movement;
flashback table table_name to timestamp|scn <timestamp|scn>
3 闪回的例子1

SQL> show user;
USER 为 "SYSTEM"
SQL> create table test as select user_id,username from dba_users;

表已创建。

SQL> select count(*) from test;

COUNT(*)

    36

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

             4110238

SQL> delete from test;

已删除36行。

SQL> commit;

提交完成。

SQL> alter table test enable row movement;

表已更改。

SQL> flashback table test to scn 4110238;

闪回完成。

SQL> select count(*) from test;

COUNT(*)

    36

SQL>

二、Using Oracle Flashback Query (SELECT AS OF)

2.1、oracle 闪回查询的说明
1、闪回查询依赖undo段,通过scn或者时间截检索修改之前的数据。insert into new_table select from old_table as of scn|timstamp xxx;操作恢复之前的数据。
2、闪回查询允许在数据库中直接检索之前的数据。语法为select
from t as of scn xxx;

2.2、闪回查询语法
1、as of scn (timestamp) 通过指定scn或者timestamp可以对表、视图、物化视图进行falshback query;
2、恢复表数据的方法
通过create table new_t as select × from old_t where 1=2;创建一个新表 然后insert into new_t select × from old_t as of scn|timestamp xxx 恢复表
开启表的行迁移功能,然后闪回表的某个scn或者时间点
alter table old_t enable row movement;
flashback table old_t to scn|timestamp to_timestamp(‘2011-05-04 12:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘)

2.3 闪回查询的例子

1、创建测试表 

SQL> create table t_1 as select username,user_id from dba_users where rownum<=8;

Table created.

SQL> select * from t_1;

USERNAME USER_ID


ZX 87
SYS 0
SYSTEM 5
ZX1 86
TEST 84
T1_USER 85
OUTLN 9
MGMT_VIEW 73

2、获取当前时间
SQL> select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;

TO_CHAR(SYSDATE,‘YY

2020-05-17 20:08:12

3、删除表
SQL> delete from t_1;

8 rows deleted.

SQL> commit;

Commit complete.

4、查询删除前的数据
SQL> select * from t_1 as of timestamp to_timestamp(‘2020-05-17 20:08:12‘,‘yyyy-mm-dd hh24:mi:ss‘);

USERNAME USER_ID


ZX 87
SYS 0
SYSTEM 5
ZX1 86
TEST 84
T1_USER 85
OUTLN 9
MGMT_VIEW 73

5、恢复表数据
方式1创建新表
SQL> create table new_t_1 as select * from t_1 where 1=2;

Table created.

SQL> insert into new_t_1 select * from t_1 as of timestamp to_timestamp(‘2020-05-17 20:08:12‘,‘yyyy-mm-dd hh24:mi:ss‘);

8 rows created.

SQL> select * from new_t_1;

USERNAME USER_ID


ZX 87
SYS 0
SYSTEM 5
ZX1 86
TEST 84
T1_USER 85
OUTLN 9
MGMT_VIEW 73

8 rows selected.

方式2闪回原表
SQL> select count(*) from t_1;

COUNT(*)

 0

SQL> alter table t_1 enable row movement;

Table altered.

SQL> flashback table t_1 to timestamp to_timestamp(‘2020-05-17 20:08:12‘,‘yyyy-mm-dd hh24:mi:ss‘);

Flashback complete.

SQL> select * from t_1;

USERNAME USER_ID


ZX 87
SYS 0
SYSTEM 5
ZX1 86
TEST 84
T1_USER 85
OUTLN 9
MGMT_VIEW 73

8 rows selected.

三、Oracle Flashback Version Query

3.1、说明

 闪回版本查询
      闪回版本查询是指oracle可以针对特定的对象来查询某一特定时间段内该对象变化的所有情况。
      闪回版本查询同闪回查询,闪回表一样,都是使用undo段的数据,即数据变更前的镜像。
      当undo数据段被覆盖,则无法进行闪回。

 闪回版本查询返回的伪列
   1 versions_startscn   行版本被创建的scn和时间截
     versions_starttime

   2 versions_endscn     该行版本过期的时间截和scn。
     versions_endtime  

   3 versions_xid        表示创建该行版本的事务id

   4 versions_operation  表示事务执行的、I表示插入、D表示删除、U表示更新

3.2、语法
闪回版本查询语法
select versions_xid,versions_startscn,versions_endscn,versions_operation,表列 from <schema.table_name> versions between scn <minimum_scn> and <maximum_scn>
select versions_xid,versions_startscn,versions_endscn,versions_operation,表列 from <schema.table_name> versions between timestamp to_timestamp(‘start_timestamp‘) and to_timestamp(‘end_timestamp‘)

3.3、使用闪回版本查询和闪回查询恢复数据(闪回到插入数据前的状态)

1、创建测试表
SQL> create table t_2 as select user_id,username from dba_users where rownum<=14;

Table created.

SQL> select * from t_2;

USER_ID USERNAME


87 ZX
 0 SYS
 5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
 9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS

USER_ID USERNAME


42 EXFSYS
30 DBSNMP
32 WMSYS

14 rows selected.

2、执行删除操作
SQL> delete from t_2 where user_id=0;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from t_2;

USER_ID USERNAME


87 ZX
 5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
 9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS
42 EXFSYS

USER_ID USERNAME


30 DBSNMP
32 WMSYS

13 rows selected.

3、执行插入操作

SQL> insert into t_2 values(100,‘zx2‘);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t_2;

USER_ID USERNAME


87 ZX
 5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
 9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS
42 EXFSYS

USER_ID USERNAME


30 DBSNMP
32 WMSYS
100 zx2

14 rows selected.

4、执行闪回版本查询

SQL> select versions_xid,versions_startscn,versions_endscn,versions_operation,user_id,username from t_2 versions between scn minvalue and maxvalue;

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN V USER_ID USERNAME


0600120093040000 2692968 D 0 SYS
87 ZX
2692968 0 SYS
5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS
42 EXFSYS
30 DBSNMP
32 WMSYS
08000400CC030000 2693052 I 100 zx2

16 rows selected.

5、利用闪回查询查询插入前
SQL> select * from t_2 as of scn 2692968;

USER_ID USERNAME


87 ZX
 5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
 9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS
42 EXFSYS
30 DBSNMP
32 WMSYS

13 rows selected.

SQL> alter table t_2 enable row movement;

Table altered.

SQL> flashback table t_2 to scn 2692968;

Flashback complete.

SQL> select * from t_2;

USER_ID USERNAME


87 ZX
 5 SYSTEM
86 ZX1
84 TEST
85 T1_USER
 9 OUTLN
73 MGMT_VIEW
74 FLOWS_FILES
57 MDSYS
53 ORDSYS
42 EXFSYS
30 DBSNMP
32 WMSYS

13 rows selected.

四、Using Oracle Flashback Transaction Query
4.1、闪回事务查询说明
1 闪回事务查询是针对于某一事务进行闪回,属于事务级别,闪回版本查询是针对某一时间段内提交记录的变化进行闪回,属于记录级别。
2 使用Flashback Transaction Query可以检索一个给定事务或者所有事务的原数据和历史数据。
2 闪回事务查询通过查询数据字典视图 flashback_transaction_query来检索特点事务的信息
3 字典视图flashback_transaction_query中的列undo_sql是和执行事务相反的逻辑dml,通过undo_sql恢复特定的事务。
4 使用的先决条件
--Flashback Transaction Query需要确保数据库的兼容性在10.0之上。
--alter database add supplemental log data
--alter database add supplemental log data(primary key) columns;
--grant execute on dbms_flashback to user;
--grant select any transaction to hr;

4.2、语法
select xid,start_scn,commit_scn,operation,logon_user,undo_sql from flashback_transaction_query where xid=‘#xid‘(xid通过闪回版本查询获取)
select xid,start_scn,commit_scn,operation,logon_user,undo_sql from flashback_transaction_query where xid in(select versions_xid from t versions between scn minvalue and maxvalue);

4.3、闪回版本查询和闪回事务查询联合应用恢复表修改的事务

1、创建测试表

SQL> conn zx/dhhz
Connected.

SQL> create table t as select username,user_id from dba_users where rownum<=5;

Table created.

SQL> select * from t;

USERNAME USER_ID


ZX 87
SYS 0
SYSTEM 5
ZX1 86
TEST 84

2、sys用户下执行如下语句
alter database add supplemental log data;
alter database add supplemental log data(primary key) columns;
grant execute on dbms_flashback to zx;
grant select any transaction to zx;

3、执行如下dml语句
先执行删除
SQL> delete from t where user_id=87 or user_ID=86;

已删除2行。

SQL> commit;

提交完成。
SQL> select * from t;

USERNAME USER_ID


SYS 0
SYSTEM 5
TEST 84

在执行更新操作
SQL> update t set user_id=100 where user_id=84;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

USERNAME USER_ID


SYS 0
SYSTEM 5
TEST 100

最后执行插入操作

SQL> insert into t values(‘zx2‘,101);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

USERNAME USER_ID


SYS 0
SYSTEM 5
TEST 100
zx2 101

3、执行闪回版本查询

在sys用户下执行
select versions_startscn,versions_endscn,versions_xid,versions_operation,username,user_id from zx.t versions between scn minvalue and maxvalue;
或者在表属主用户下执行
select versions_startscn,versions_endscn,versions_xid,versions_operation,username,user_id from t versions between scn minvalue and maxvalue;

SQL> select versions_startscn,versions_endscn,versions_xid,versions_operation,username,user_id from t versions between scn minvalue and maxvalue;

VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID V USERNAME USER_ID


  2682673                      02002000B7030000 U TEST                            100
  2682601                      01001500DB020000 D ZX1                             86
  2682601                      01001500DB020000 D ZX                              87
          2682601                                 ZX                              87
                                                  SYS                              0
                                                  SYSTEM                          5
          2682601                                 ZX1                             86
          2682673                                 TEST                            84
  2682715                      03000C00B2030000 I zx2                             101

9 rows selected.
4、执行闪回事务查询

select xid,start_scn,commit_scn,operation,logon_user,undo_sql from flashback_transaction_query where xid in(select versions_xid from t versions between scn minvalue and maxvalue);

SQL> select xid,start_scn,commit_scn,operation,logon_user,undo_sql from flashback_transaction_query where xid in(select versions_xid from t versions between scn minvalue and maxvalue);

XXID START_SCN COMMIT_SCN OPERATION LOGON_US UNDO_SQL


02002000B7030000 2682668 2682673 UPDATE ZX update "ZX"."T" set "USER_ID" = ‘84‘ where ROWID = ‘AAAVXqAAIAAAACDAAE‘;
02002000B7030000 2682668 2682673 BEGIN ZX
03000C00B2030000 2682709 2682715 INSERT ZX delete from "ZX"."T" where ROWID = ‘AAAVXqAAIAAAACGAAA‘;
03000C00B2030000 2682709 2682715 BEGIN ZX
01001500DB020000 2682596 2682601 DELETE ZX insert into "ZX"."T"("USERNAME","USER_ID") values (‘ZX1‘,‘86‘);
1001500DB020000 2682596 2682601 DELETE ZX insert into "ZX"."T"("USERNAME","USER_ID") values (‘ZX‘,‘87‘);
01001500DB020000 2682596 2682601 BEGIN ZX

5、执行undo_sql撤销delete的事务修改
SQL> insert into "ZX"."T"("USERNAME","USER_ID") values (‘ZX1‘,‘86‘);
insert into "ZX"."T"("USERNAME","USER_ID") values (‘ZX‘,‘87‘);

1 row created.
1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;

USERNAME USER_ID


SYS 0
SYSTEM 5
TEST 100
zx2 101
ZX1 86
ZX 87

6 rows selected.

五 闪回drop对象
5.1 闪回drop说明
当drop一个表,数据库不会立即移除该表的空间,重命名该表并放置该表和其相关对象到recycle bin,用户可以从recycle bin中恢复该表,该功能
被称为flashback drop
5.2 oracle的recycle bin是什么
1、recycle bin 实际上是一个包含drop对象的数据字典表。
2、以drop的表及相关对象如索引、约束、嵌套表、仍旧占用空间,除非用户从回收站中清除或者drop的时候后指定purge关键字
3、每一个用户都可以认为有自己的回收站,并且只可以在回收站中访问自己有权限的对象,除了sysdba权限的用户。用户可以通过
select * from recyclebin;访问回收站中的对象。
4、当drop表后,表和其相关对象被放置到回收站中,系统会自动为其生成一个名字。主要是为了避免如下两点,
1、用户drop了一个表,然后重新创建了一个相同的表,之后又重新创建了它。
2、为了防止两个用户有相同的表,又同时丢弃了它。
5、回收站中自动生成名字格式如下: BIN$unique_id$version
unique_id 包含26个字符的唯一标识。
version 数据库的版本号
6、Enabling and Disabling the Recycle Bin
1、当recycle bin开启,drop表和其相关的对象就会被放入回收站。
2、当recycle bin禁止,drop表和其相关的对象不会放入回收站。
3、禁止回收站不会影响已经放入回收站中的对象。
4、recycle bin 默认是开启的
5、更改recyclebin的初始化参数不是动态的。需要重启数据库
6、禁止recycle bin
alter session set recyclebin = OFF;
alter system set recyclebin = OFF scope=spfile;
7、开启recycle bin中
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
语法:
FLASHBACK TABLE <table_name> TO BEFORE DROP [RENAME TO <new_name>];

5.3 查询recycle bin中的对象
1 通过视图查询所有回收站中的对象dba_recyclebin(注意比recyclebin视图多owner字段)
col original_name for a10;
set linesize 400
SQL> select owner,object_name,original_name,operation,ts_name,createtime,droptime,space from dba_recyclebin;

OWNER OBJECT_NAME ORIGINAL_N OPERATION TS_NAME CREATETIME DROPTIME SPACE


SYS BIN$LqtH6lHHSfW3cJSHmi6hHw==$0 T DROP CS 2017-03-17:17:19:29 2017-10-15:15:50:14 8
SCOTT BIN$3nneKue8QvGu7xWahLU6bQ==$0 BONUS DROP USERS 2013-10-09:19:08:36 2017-07-03:18:44:09 0
SYS BIN$DOATFaa7QZyA2P0/R6ptVQ==$0 IDX_ZX3_ID DROP CS_INDEX 2017-06-17:14:27:20 2017-09-10:21:14:44 8
SYS BIN$uG5Ig3cgRRGza99p1c0cRA==$0 ZX3 DROP CS 2017-06-17:11:49:49 2017-09-10:21:14:44 8
SYS BIN$5E2ar/LWR96M0HtwFM/xQw==$0 ZX3 DROP CS 2017-09-10:21:14:51 2017-09-14:20:05:08 8
SYS BIN$8uUxSd1TRbO15dE+XvJLpg==$0 PK_ID DROP CS 2017-09-14:22:06:14 2017-09-14:22:10:27 256
SYS BIN$AO0VCG1oSR6PtgtmnlwVCA==$0 ZX3 DROP CS 2017-09-14:22:06:14 2017-09-14:22:10:27 256

SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


T BIN$LqtH6lHHSfW3cJSHmi6hHw==$0 TABLE 2017-10-15:15:50:14
ZX3 BIN$AO0VCG1oSR6PtgtmnlwVCA==$0 TABLE 2017-09-14:22:10:27
ZX3 BIN$5E2ar/LWR96M0HtwFM/xQw==$0 TABLE 2017-09-14:20:05:08
ZX3 BIN$uG5Ig3cgRRGza99p1c0cRA==$0 TABLE 2017-09-10:21:14:44

 2 查询每个用户回收站中的对象(视图user_recyclebin或者同名recyclebin)

SQL> select object_name,original_name,operation,ts_name,createtime,droptime,space from recyclebin;

OBJECT_NAME ORIGINAL_N OPERATION TS_NAME CREATETIME DROPTIME SPACE


BIN$LqtH6lHHSfW3cJSHmi6hHw==$0 T DROP CS 2017-03-17:17:19:29 2017-10-15:15:50:14 8
BIN$DOATFaa7QZyA2P0/R6ptVQ==$0 IDX_ZX3_ID DROP CS_INDEX 2017-06-17:14:27:20 2017-09-10:21:14:44 8
BIN$uG5Ig3cgRRGza99p1c0cRA==$0 ZX3 DROP CS 2017-06-17:11:49:49 2017-09-10:21:14:44 8
BIN$5E2ar/LWR96M0HtwFM/xQw==$0 ZX3 DROP CS 2017-09-10:21:14:51 2017-09-14:20:05:08 8
BIN$8uUxSd1TRbO15dE+XvJLpg==$0 PK_ID DROP CS 2017-09-14:22:06:14 2017-09-14:22:10:27 256
BIN$AO0VCG1oSR6PtgtmnlwVCA==$0 ZX3 DROP CS 2017-09-14:22:06:14 2017-09-14:22:10:27 256

5.4 清除recycle bin中的对象
1、使用purge语句清除回收站中的对象和其相关对象并释放存储空间。不过需要有对对象进行处理的权限。
2、使用purge清除对象时候可以使用回收站中的BIN$unique_id$version或者使用original_name名字。
SQL> purge table T;

表已清除。

SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


ZX3 BIN$AO0VCG1oSR6PtgtmnlwVCA==$0 TABLE 2017-09-14:22:10:27
ZX3 BIN$5E2ar/LWR96M0HtwFM/xQw==$0 TABLE 2017-09-14:20:05:08
ZX3 BIN$uG5Ig3cgRRGza99p1c0cRA==$0 TABLE 2017-09-10:21:14:44

SQL> purge table "BIN$AO0VCG1oSR6PtgtmnlwVCA==$0";

表已清除。
3、清空回收站中该用户自己的所有对象。如果用户有sysdba权限则清空整个回收站中的内容。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


BONUS BIN$3nneKue8QvGu7xWahLU6bQ==$0 TABLE 2017-07-03:18:44:09

SQL> purge recyclebin;

回收站已清空。
5、清除回收站内来自于某个表空间或者某个表空间中属于某个用户的所有对象
--purge tablespace CS;
--PURGE TABLESPACE CS USER SYS;
SQL> select owner,object_name,original_name,operation,ts_name,createtime,droptime,space from dba_recyclebin where type=‘TABLE‘;

OWNER OBJECT_NAME ORIGINAL_N OPERATION TS_NAME CREATETIME DROPTIME



SYS BIN$uG5Ig3cgRRGza99p1c0cRA==$0 ZX3 DROP CS 2017-06-17:11:49:49 2017-09-10:21:14:44
SYS BIN$5E2ar/LWR96M0HtwFM/xQw==$0 ZX3 DROP CS 2017-09-10:21:14:51 2017-09-14:20:05:08

SQL> purge tablespace CS;

表空间已清除。

5.5 从recycle bin中恢复表
恢复语句
1、使用flashback table ... to before drop 语句恢复recycle bin 中的对象。可以指定BIN$unique_id$version名字或者original_name名字
2、rename to 子句允许用户在恢复drop表时指定新的名字。
3、recyclebin中的name可以同过dba_recyclebin or user_recyclebin中查询到。
恢复的例子1 调用flashback table "BIN$unique_name" to before drop;
SQL> select count(*) from zx1;

COUNT(*)

1000000

SQL> drop table zx1;

表已删除。

SQL> commit;

提交完成。

SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


ZX1 BIN$jJEAEswtQZeDDoMRTrzv7g==$0 TABLE 2017-10-20:21:20:36
SQL> flashback table "BIN$jJEAEswtQZeDDoMRTrzv7g==$0" to before drop;

闪回完成。

SQL> select count(*) from zx1;

COUNT(*)

1000000

恢复的例子2 调用flashback table table_name to before drop
SQL> select owner,table_name from dba_tables where tablespace_name=‘CS‘;

OWNER TABLE_NAME


SYS ZX1
SYS ZX2
SCOTT ZX3
ZX DE
ZX SO

SQL> drop table zx2;

表已删除。

SQL> commit;

提交完成。

SQL> flashback table zx2 to before drop;

闪回完成。

SQL> select count(*) from zx2;

COUNT(*)

     1   

恢复的例子3 调用flashback table "BIN$unique_name$version" to before drop rename to new_name;
SQL> select owner,table_name from dba_tables where tablespace_name=‘CS‘;

OWNER TABLE_NAME


SYS ZX1
SYS ZX2
ZX DE
ZX SO
SCOTT ZX3

SQL> drop table zx2;

表已删除。

SQL> commit;

提交完成。

SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


ZX2 BIN$BpVtfUThQZ6e4xd6mV3d5Q==$0 TABLE 2017-10-20:21:27:18
SQL> flashback table "BIN$BpVtfUThQZ6e4xd6mV3d5Q==$0" to before drop rename to zx2_new;

闪回完成。

SQL> select owner,table_name from dba_tables where tablespace_name=‘CS‘;

OWNER TABLE_NAME


ZX SO
ZX DE
SYS ZX1
SYS ZX2_NEW
SCOTT ZX3

5.6、从回收站中恢复表依赖的对象
1、从回收站中恢复了drop的表,依赖该表的对象索引不会自动变回最初的original_name,而是依旧在回收站中保留系统生成的名字。
2、必须手动重命名依赖的对象为original names
3、恢复依赖对象前须先恢复表。
4、恢复依赖对象的例子(语句为alter index "BIN$unique_name$version" rename to index_name;
SQL> create table zx1(id int) tablespace cs;

表已创建。

SQL> begin
2 for i in 1 .. 100 loop
3 insert into zx1 values(i);
4 end loop;
5 end;
6 /

PL/SQL 过程已成功完成。

SQL> select count(*) from zx1;

COUNT(*)

   100

SQL> create unique index pk_id_zx1 on zx1(id);

索引已创建。

SQL> select index_name,index_type from dba_indexes where table_name=‘ZX1‘;

INDEX_NAME INDEX_TYPE


PK_ID_ZX1 NORMAL

SQL>
SQL> drop table zx1;

表已删除。

SQL> commit;

提交完成。

SQL> select object_name,original_name,type from recyclebin;

OBJECT_NAME ORIGINAL_N TYPE


BIN$49qibaCKSDeeSeYN+1EJOw==$0 PK_ID_ZX1 INDEX
BIN$9h+CmvENQnmPxSkNfFX8yg==$0 ZX1 TABLE

SQL> flashback table "BIN$9h+CmvENQnmPxSkNfFX8yg==$0" to before drop;

闪回完成。

SQL> select index_name from dba_indexes where table_name=‘ZX1‘;

INDEX_NAME

BIN$49qibaCKSDeeSeYN+1EJOw==$0

SQL> alter index "BIN$49qibaCKSDeeSeYN+1EJOw==$0" rename to pk_id_zx1;

索引已更改。

SQL>

六、闪回数据库
6.1 数据库闪回说明
1 闪回数据库前,需要数据库配置闪回区
2 数据库闪回功能默认是关闭的。需要在mount下发起如下命令启用。alter database flashback on;
3 数据库启用闪回功能后数据库会定期将发生变化的数据库的前镜像写入闪回日志文件中。
4 闪回数据库的日志文件由RecoVery WRiter的新过程写入。
5 以下情况下不能使用闪回数据库操作:
– 控制文件已还原或已重新创建。
– 表空间已删除。
– 数据文件的大小已被减小。
6 使用 TO BEFORE RESETLOGS 子句闪回至上一RESETLOGS 操作前的那一刻

6.2 开启数据库闪回功能
SQL> select dbid,name,flashback_on,current_scn from v$database;

  DBID NAME                                               FLASHBACK_ON       CURRENT_SCN

1346236889 CS NO 4068082

提交完成。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 4175568896 bytes
Fixed Size 2287832 bytes
Variable Size 2332034856 bytes
Database Buffers 1828716544 bytes
Redo Buffers 12529664 bytes
数据库装载完毕。
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38709: 尚未启用恢复区。

SQL> alter system set db_recovery_file_dest_size=2G;

系统已更改。

SQL> alter system set db_recovery_file_dest=‘D:app ecoveryarea‘;

系统已更改。

SQL> alter database flashback on;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select open_mode from v$database;

OPEN_MODE

READ WRITE

SQL> select dbid,name,flashback_on,current_scn from v$database;

  DBID NAME                                               FLASHBACK_ON       CURRENT_SCN

1346236889 CS YES 4068605

6.3 数据库闪回的例子
SQL> alter session set nls_date_format=‘YYYY-MM-DD HH24:MI:SS‘;

会话已更改。

SQL> select sysdate from dual;

SYSDATE

2017-10-15 19:59:40

SQL> truncate table new_t;

表被截断。

SQL> select sysdate from dual;

SYSDATE

2017-10-15 20:00:14

SQL> startup force mount;
ORACLE 例程已经启动。

Total System Global Area 4175568896 bytes
Fixed Size 2287832 bytes
Variable Size 2332034856 bytes
Database Buffers 1828716544 bytes
Redo Buffers 12529664 bytes
数据库装载完毕。

SQL> flashback database to timestamp to_timestamp (‘2017-10-15 19:59:40‘,‘yyyy-mm-dd hh24:mi:ss‘);

闪回完成。

SQL> alter database open resetlogs;

数据库已更改。

SQL>

SQL> select * from new_t;

USERNAME USER_ID


PIG 88
CAT 89
DOG 86
PERFSTAT 95
SYS 0
SYSTEM 5
SCOTT 83
NSR 94
ZX 85
OUTLN 9
MGMT_VIEW 73

USERNAME USER_ID


FLOWS_FILES 74
MDSYS 57
ORDSYS 53
EXFSYS 42

已选择15行。

flashback database to timestamp to_timestamp (‘2017-10-15 19:59:40‘,‘yyyy-mm-dd hh24:mi:ss‘)
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
started logmerger process
Parallel Media Recovery started with 4 slaves
Sun Oct 15 20:04:11 2017
Recovery of Online Redo Log: Thread 1 Group 1 Seq 319 Reading mem 0
Mem# 0: D:DATACSREDO01.LOG
Incomplete Recovery applied until change 4069311 time 10/15/2017 19:59:58
Sun Oct 15 20:04:13 2017
Flashback Media Recovery Complete
Completed: flashback database to timestamp to_timestamp (‘2017-10-15 19:59:40‘,‘yyyy-mm-dd hh24:mi:ss‘)

6.4、查询闪回状态
要针对保留目标监视容量:
? 查看快速恢复区的磁盘限额:
SELECT estimated_flashback_size,flashback_size,FROM V$FLASHBACK_DATABASE_LOG;
FLASHBACK_SIZE 给出了闪回数据的当前字节大小
STIMATED_FLASHBACK_SIZE 使用先前记录的闪回数据,可估计快速恢复区中闪回日志需要多少磁盘空间才能满足当前闪回保留目标
? 确定当前闪回窗口:
SELECT oldest_flashback_scn,oldest_flashback_time FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN 和 OLDEST_FLASHBACK_TIME 显示了数据库可闪回到的近似最低 SCN 和时间。V$DATABASE 中的 CURRENT_SCN 给出了当前数据库 SCN
? 监视闪回数据库日志中的日志记录:
SELECT begin_time, end_time, flashback_data, db_data, redo_data,estimated_flashback_size AS EST_FB_SZE FROM V$FLASHBACK_DATABASE_STAT;
闪回区查询
查询 V$RECOVERY_FILE_DEST 可查看与快速恢复区相关的信息。列说明如下:
? NAME :快速恢复区的名称,指示位置字符串
? SPACE_LIMIT :在 DB_RECOVERY_FILE_DEST_SIZE 参数中指定的磁盘限制
? SPACE_USED :快速恢复区文件使用的空间(字节)
? SPACE_RECLAIMABLE :通过删除过时文件、冗余文件和其它空间管理算法确定的
低优先级文件,可回收的空间量
? NUMBER_OF_FILES :文件数量
SQL> SELECT name, space_limit AS quota,
2 space_used AS used,
3 space_reclaimable AS reclaimable,
4 number_of_files AS files
5 FROM v$recovery_file_dest ;
NAME QUOTA USED RECLAIMABLE FILES


/u01/flash_recovery_area 5368707120 2507809104 203386880 226

以上是关于oracle闪回特性的主要内容,如果未能解决你的问题,请参考以下文章

4. Oracle 闪回特性(Flashback VersionFlashback Transaction)

3.Oracle 闪回特性(Flashback QueryFlashback Table)

oracle闪回区介绍与监控

如何打造 PostgreSQL 闪回环境?

Oracle闪回技术[未完]

2.Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)