Oracle闪回(flashback)功能详解 闪回数据归档(Flashback Data Archive)-lhrbest-ITPUB博客
  • 博客访问: 6779967
  • 博文数量: 1036
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-23 17:46
  • 认证徽章:
个人简介

QQ:646634621| 网名:小麦苗| 微信公众号:xiaomaimiaolhr| 11g OCM| QQ群:618766405 微信群:私聊| 《数据库笔试面试宝典》作者| OCP、OCM网络班开讲啦,有需要的小伙伴可以私聊我。

文章分类

全部博文(1036)

文章存档

2018年(47)

2017年(439)

2016年(310)

2015年(167)

2014年(73)

分类: Oracle

2017-04-02 12:59:35


Oracle闪回(flashback)功能详解  闪回数据归档(Flashback Data Archive)








Oracle10g 引入的闪回技术包含
1闪回查询(flashback query
2闪回版本查询(flashback version query 
3闪回事务查询(flashback transcation query
4闪回表(flashback table
5闪回删除(flashback drop 
6
闪回数据库(flashback database)。

其中闪回查询、闪回版本查询、闪回事务查询属于行级闪回。这三种闪回技术全部依赖于undo表空间中的undo数据。
闪回表、闪回删除属于表级闪回。闪回表也是从undo中读取数据,闪回删除是依赖recyclebin 
闪回数据库属于数据库级闪回。


Flashback query是最基本的闪回功能,直接利用回滚段中的旧数据构造某一个时刻的一致性数据版本。只适合单个表数据恢复。对事务中相关多表数据恢复不适合,无法确保相关数据的参照完整性。Flashback query不需要使用resetlogs打开数据库。闪回查询让你能够看到过去某个时间的的数据。能够让你查看和重构以为意外被删除或者该表的数据。你可以根据SCN号和具体时间进行数据库查询。参数undo_retention 表明在回滚段中旧的信息被覆盖之前保留的时间。通过使用AS OF字句,你可以查询一个表中不同时段的快照。
AS OF Specify AS OF to retrieve the single version of the rows returned by the query at a particular change number (SCN) or timestamp. If you specify SCN, then expr must evaluate to a number. If you specify TIMESTAMP, then expr must evaluate to a timestamp value. Oracle Database returns rows as they existed at the specified system change number or time.---指定AS OF能够通过指定的SCN或者时间戳来获取所有行的单个版本,如果你指定SCN,则后面必须跟数字,如果你指定timestamp,则后面必须指定一个具体时间,Oralce数据会返回在该时间点或者SCN号时的数据。

根据SCN的闪回查询:
1、初始化数据
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> insert into t values(2,2);
1 row created.
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
2、查询当前时间、当前SCN号
SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual; ---获取当前时间
SYSDATE
-----------------
20140313 22:37:48
SQL> select dbms_flashback.get_system_change_number from dual; ---获取当前SCN
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1136165

3、删除部分数据
SQL> delete from t where b=3;
1 row deleted.
SQL> commit;
Commit complete.
4、根据SCN或者时间进行闪回查询
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
SQL> select * from t as of scn 1136165;  ---根据SCN号得到在该SCN号时的数据情况
         A          B
---------- ----------
         1          1
         2          2
         3          3
SQL> select * from t as of timestamp to_timestamp('20140313 22:37:48','yyyymmdd hh24:mi:ss'); --得到具体时间点的数据
         A          B
---------- ----------
         1          1
         2          2
         3          3


Flashback version query 允许查看相同行在一段时间内所有的版本,记录了数据的历史变化过程

Flashback transcation query 能够查询事务对表所做的操作,通过UNDO SQL可以取消对事务所做的修改。查询FLASHBACK_TRANSACTION_QUERY这个数据字典表来获取字典事务ID的信息.

Flashback Version Query 闪回版本查询


使用Flashback Version Query  返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本。

 

语法如下:

SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} 

--start,end可以是时间也可以是scn


Flashback Version Query伪列说明


versions_start{scn|time}  版本开始的scn或时间戳

 

versions_end{scn|time}  版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本或行被删除(即versions_operation值为D)。

 

versions_xid 创建行版本的事务ID

 

versions_operation  在行上执行的操作(I=插入,D=删除,U=更新)

 

 

示例说明:

 


SQL> create table xyc_t1 as select * from emp where 1=2;  --创建表xyc_t1

Table created.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp开始时间

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 08:17:58

SQL> insert into xyc_t1 select * from emp where empno=7902;   --插入empno=7902

1 row created.

SQL> commit;                                                                               --插入一行提交作为一个版本

Commit complete.

SQL> insert into xyc_t1 select * from emp where empno=7788;

1 row created.

SQL> insert into xyc_t1 select * from emp where empno=7698;

1 row created.

SQL> commit;                                                                             --插入两行提交作为一个版本

Commit complete.

SQL> update xyc_t1 set sal=8888 where empno=7788;

1 row updated.

SQL> commit;                                                                          --再次更改empno=7788的行提交,使这行有旧版本

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp结束时间

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 08:20:01

 

/*

select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
from xyc_t1 versions between timestamp to_timestamp('2013-10-06 10:14:04','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 10:14:23','YYYY-MM-DD HH24:MI:SS');

*/

 

SQL> select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
  2  from xyc_t1 versions between timestamp to_timestamp('2013-10-06 08:17:58','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 08:20:01','YYYY-MM-DD HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME             VERSIONS_ENDSCN VERSIONS_ENDTIME               VERSIONS_XID     VERSIONS_OPERATION        EMPNO
----------------- ------------------------------ --------------- ------------------------------ ---------------- -------------------- ----------
          1032654              06-OCT-13 08.19.51 AM                                                                                            08000E0016030000       U                                   7788
          1032637              06-OCT-13 08.19.14 AM                                                                                            0600180017030000        I                                    7698
          1032637              06-OCT-13 08.19.14 AM             1032654                06-OCT-13 08.19.51 AM          0600180017030000        I                                    7788
          1032628              06-OCT-13 08.18.47 AM                                                                                            090014002C030000        I                                    7902


--可以看出,一次commit是一个版本,当前版本的versions_endscn和versions_endtime值为空,旧版本则有值。


Flashback Transaction Query闪回事务查询


Flashback Transaction Query实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。

flashback_transaction_query 列说明:

SQL> desc flashback_transaction_query
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 XID                                                       RAW(8)                 --事务ID
 START_SCN                                          NUMBER                --事务起始SCN,即第一个dml的SCN
 START_TIMESTAMP                             DATE                      --事务其实时间戳,即第一个dm的时间戳
 COMMIT_SCN                                      NUMBER                --提交事务时的SCN
 COMMIT_TIMESTAMP                         DATE                      -- 提交事务时的时间戳
 LOGON_USER                                      VARCHAR2(30)       --本次事务的用户
 UNDO_CHANGE#                                NUMBER                --撤销SCN
 OPERATION                                         VARCHAR2(32)       --执行的dml操作:DELETE,INSERT,UPDATE,BEGIN,UNKNOWN
 TABLE_NAME                                       VARCHAR2(256)     --dml更改的表
 TABLE_OWNER                                     VARCHAR2(32)      --表的所有者
 ROW_ID                                                VARCHAR2(19)       --修改行的ROWID
 UNDO_SQL                                           VARCHAR2(4000)   -?-撤销dml的sql语句

 

--使用闪回事务查询前,必须启用重做日志流的其他日志记录,重做日志流与Log Miner使用的数据相同,只是接口不同。

示例说明:

SQL> conn / as sysdba;

SQL> alter database add supplemental log data;

Database altered.

SQL> alter database add supplemental log data (primary key) columns;

Database altered.

SQL> grant select any transaction to scott;

Grant succeeded.

SQL> conn scott/xyc


SQL> update xyc_t1 set sal=9999 where empno=7902;     --更改值sal=9999

1 row updated.

SQL> commit;

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 10:14:04

SQL> update xyc_t1 set sal=99999 where empno=7902;  --更改值sal=99999

1 row updated.

SQL> commit;

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 10:14:23

 


SQL> select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
  2  from xyc_t1 versions between timestamp to_timestamp('2013-10-06 10:14:04','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 10:14:23','YYYY-MM-DD HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME             VERSIONS_ENDSCN VERSIONS_ENDTIME               VERSIONS_XID     VERSIONS_OPERATION        EMPNO
----------------- ------------------------------ --------------- ------------------------------ ---------------- -------------------- ----------
   1035726                     06-OCT-13 10.14.17 AM                                                                                             0400040097020000 U                                        7902
                                                                                                                                                                                                                                                      7698
                                                                                      1035726                    06-OCT-13 10.14.17 AM                                                                                        7902


--查询事务id

 

SQL> select start_scn,commit_scn,logon_user,operation,table_name,undo_sql
  2  from flashback_transaction_query
  3  where xid=hextoraw('0400040097020000');

 START_SCN COMMIT_SCN LOGON_USER           OPERATION            TABLE_NAME           UNDO_SQL
---------- ---------- -------------------- -------------------- -------------------- --------------------------------------------------
   1035724    1035726           SCOTT                                   UPDATE       XYC_T1               update "SCOTT"."XYC_T1" set "SAL" = '9999' where R
                                                                                                                              OWID = 'AAASNYAAEAAAAIVAAD';

 

--查出undo sql

 

SQL> update "SCOTT"."XYC_T1" set "SAL" = '9999' where ROWID = 'AAASNYAAEAAAAIVAAD';

1 row updated.

SQL> select * from xyc_t1;
select * from xyc_t1;

     EMPNO ENAME                JOB                       MGR HIREDATE                   SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
      7698 BLAKE                MANAGER                  7839 1981-05-01 00:00:00       2850                    30
      7902 FORD                 ANALYST                    7566 1981-12-03 00:00:00       9999                    20

--返回到上一版本,即sal值为9999




1.闪回查询:

步骤是记录当前SCN及时间,然后进行DML操作,提交后使用 timestamp和SCN进行对DML操作之前数据的查询

SQL> set time on;
19:13:57 SQL> insert into test select rownum from dual connect by rownum<=5;
5 rows inserted
19:14:47 SQL> commit; 
Commit complete 
19:14:49 SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1362061
19:18:11 SQL> delete  test where a>2; 
3 rows deleted 
19:18:17 SQL> commit; 
Commit complete
19:21:56
 SQL> select * from test as of timestamp to_timestamp('2013/06/23 19:17:00','yyyy/mm/dd hh24:mi:ss');
         A
----------
         2
         3
         4
         5
         1
19:24:23 SQL> select * from test as of scn 1362061;
         A
----------
         2
         3
         4
         5

         1

2.闪回查询--查询的是已经提交的数据

因为闪回查询的是已经提交的,这样即使数据未提交而数据库SHUTDOWN ABORT,重启后因为做实例恢复,使用闪回所查询的数据仍是已经提交的。

实验过程:查询当前SCN并执行DML操作不提交并查询当前SCN,使用闪回查询功能查询DML操作之前和之后的SCN

结果是:验证闪回查询返回的是已经提交的数据。

20:22:44 BYS@bys1>select * from test3;
        ID NAME
---------- ----------
         2 b
20:22:48 BYS@bys1>select current_scn from v$database;
CURRENT_SCN
-----------
    1741868
20:26:17 BYS@bys1>delete test3;   ---不提交
1 row deleted.

各种查询:

20:26:26 BYS@bys1>select * from test3;
no rows selected
20:26:29 BYS@bys1>select current_scn from v$database;
CURRENT_SCN
-----------
    1741881
20:26:50 BYS@bys1>select * from test3 as of scn 1741868;
        ID NAME
---------- ----------
         2 b
20:27:10 BYS@bys1>select * from test3 as of scn 1741881;
        ID NAME
---------- ----------
         2 b

3.闪回版本查询

versions_operation:    操作类型
versions_xid:    事务编号
versions_starttime:    开始时间
versions_endtime:    结束时间,如果有值,证明这记录已非当前记录
versions_startscn:    开始SCN号

versions_endscn:    结束SCN号 如果有值,证明这记录已非当前记录

操作步骤:

19:25:28 SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1362268
19:37:09 SQL> col versions_starttime for a25
19:37:22 SQL> col versions_endtime for a25
19:38:02 SQL> select versions_startscn,versions_starttime, versions_endtime, versions_operation,versions_xid  from  test  versions between  timestampto_timestamp('2013/06/2319:17:00','yyyy/mm/dd hh24:mi:ss')and  to_timestamp('2013/06/2319:20:00','yyyy/mm/dd hh24:mi:ss');
 
VERSIONS_STARTSCN VERSIONS_STARTTIME        VERSIONS_ENDTIME          VERSIONS_OPERATION VERSIONS_XID
----------------- ------------------------- ------------------------- ------------------ ----------------
          1362122 23-JUN-13 07.19.48 PM                               D                  04001200C8020000
          1362122 23-JUN-13 07.19.48 PM                               D                  04001200C8020000
          1362122 23-JUN-13 07.19.48 PM                               D                  04001200C8020000
                                            23-JUN-13 07.19.48 PM                        
                                            23-JUN-13 07.19.48 PM                        
                                            23-JUN-13 07.19.48 PM                        
8 rows selected

4.闪回事务查询

闪回事务查询需要打开追加日志,不然无法从 flashback_transaction_query查出UNDO_SQL

20:35:42 SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
20:35:57 SQL> alter database add supplemental log data;
Database altered.
20:38:01 SQL> select * from test;
         A
----------
         2
         3
         1
20:38:24 SQL> update test set a=a+10;
3 rows updated.
20:38:36 SQL> commit;
Commit complete.
20:39:37 SQL> col versions_endtime for a20
20:40:25 SQL> col versions_starttime for a20
20:40:36 SQL> set pagesize 100
20:41:56 SQL> select  versions_startscn,versions_starttime, versions_endtime, versions_operation,versions_xid  from test versions between  timestamp to_timestamp('2013/06/23 20:38:00','yyyy/mm/dd hh24:mi:ss') and to_timestamp('2013/06/23 20:39:00','yyyy/mm/dd hh24:mi:ss');

VERSIONS_STARTSCN VERSIONS_STARTTIME   VERSIONS_ENDTIME     V VERSIONS_XID
----------------- -------------------- -------------------- - ----------------
          1369588 23-JUN-13 08.38.41 PM                      U 060001003A030000
          1369588 23-JUN-13 08.38.41 PM                      U 060001003A030000
          1369588 23-JUN-13 08.38.41 PM                      U 060001003A030000                 
                                       23-JUN-13 08.38.41 PM
                                       23-JUN-13 08.38.41 PM
                                       23-JUN-13 08.38.41 PM
6 rows selected.
20:41:57 SQL> col operation for a10
20:43:07 SQL> col undo_sql for a60
20:43:20 SQL> select operation,undo_sql  from flashback_transaction_querywhere logon_user='BYS'  andundo_sql like '%TEST%';
OPERATION  UNDO_SQL
---------- ------------------------------------------------------------
UPDATE     update "BYS"."TEST" set "A" = '1' where ROWID = 'AAASYyAAEAA
           AAcjAKR';
UPDATE     update "BYS"."TEST" set "A" = '3' where ROWID = 'AAASYyAAEAA
           AAcjAAE';
UPDATE     update "BYS"."TEST" set "A" = '2' where ROWID = 'AAASYyAAEAA
           AAcjAAA';
20:44:12 SQL> select operation,undo_sql  from flashback_transaction_query where logon_user='BYS'  and undo_sql like '%TEST%' andxid=HEXTORAW('060001003A030000');
OPERATION  UNDO_SQL
---------- ------------------------------------------------------------
UPDATE     update "BYS"."TEST" set "A" = '1' where ROWID = 'AAASYyAAEAA
           AAcjAKR';
UPDATE     update "BYS"."TEST" set "A" = '3' where ROWID = 'AAASYyAAEAA
           AAcjAAE';
UPDATE     update "BYS"."TEST" set "A" = '2' where ROWID = 'AAASYyAAEAA
           AAcjAAA';
可以使用XID做为条件 :
20:45:01 SQL> select operation,undo_sql  from flashback_transaction_querywhere  xid=HEXTORAW('060001003A030000');
OPERATION  UNDO_SQL
---------- ------------------------------------------------------------
UPDATE     update "BYS"."TEST" set "A" = '1' where ROWID = 'AAASYyAAEAA
           AAcjAKR';
UPDATE     update "BYS"."TEST" set "A" = '3' where ROWID = 'AAASYyAAEAA
           AAcjAAE';
UPDATE     update "BYS"."TEST" set "A" = '2' where ROWID = 'AAASYyAAEAA
           AAcjAAA';
BEGIN
可以使用XID做为条件 :
20:45:17 SQL> select operation,undo_sql  from flashback_transaction_querywhere  xid='060001003A030000';
OPERATION  UNDO_SQL
---------- ------------------------------------------------------------
UPDATE     update "BYS"."TEST" set "A" = '1' where ROWID = 'AAASYyAAEAA
           AAcjAKR';
UPDATE     update "BYS"."TEST" set "A" = '3' where ROWID = 'AAASYyAAEAA
           AAcjAAE';
UPDATE     update "BYS"."TEST" set "A" = '2' where ROWID = 'AAASYyAAEAA
           AAcjAAA';
BEGIN






Flashback table复原一个表到某个时间点,或者某个SCN而不用回复数据文件。闪回表依赖UNDO数据,当表结构改变的时候,不能进行闪回。
Flashback drop用户恢复被误删除的表。允许你从当前数据库中恢复一个被drop的对象。在执行drop操作时,现在oracle不是真正删除他,而是将对象自动放入回收站,对于一个对象的删除,其实就是一个简单的重命令操作,并且所在的表空间不变。表上面的约束也在放在回收站里面,在闪回后,索引的名称还是系统默认的,需要手工还原。表上的物化视图日志不会随着表的删除而放入回收站。
对闪回表语句不能进行回滚,如何要闪回表,你需要有对表的flashback对象权限或者flashback any table系统权限。row movement对应flash drop没有影响,但是想要使用闪回表来恢复被删除的数据时,就需要开启row movement。flashback drop不会恢复表相关的约束信息
flashback table to scn或者to timestamp,如果当前存在索引,闪回到创建索引之前的时间时候,闪回后,系统仍然存在索引。如果当前drop了索引,那闪回到创建索引的时间点时,索引是变成没有了。


闪回表的命令如下:


TO SCN Clause
示例如下:
SQL> create tablespace tbs_user datafile '/u01/app/oracle/oradata/PROD/disk1/tbs_user.dbf' size 20M autoextend on extent management local;
Tablespace created.
SQL> create user sec identified by sec default tablespace tbs_user;
User created.
SQL> grant connect,resource,dba to sec;
Grant succeeded.

SQL> conn sec/sec
Connected.
SQL> create table t (a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1169506
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1169526

SQL> flashback table t to scn 1169506;  ----闪回表的时候,需要对表执行row movment
flashback table t to scn 1169506
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

SQL> alter table t enable row movement;
Table altered.
SQL> flashback table t to scn 1169506;
Flashback complete.
SQL> select * from t;------表闪回到具体的SCN时的情形


         A          B
---------- ----------
         1          1

SQL> flashback table t to scn 1169526;
Flashback complete.
SQL> select * from t; ---闪回到最后的位置
         A          B
---------- ----------
         1          1
         2          2
----------------------------------下面是验证索引在flashback table to scn中的情况-----
SQL> drop table t;
Table dropped.
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                1170627
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> create index idx_t on t(a);
Index created.
SQL> select dbms_flashback.get_system_change_number from dual; ---该时间点表中存在索引
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1170662
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1170672

SQL> select index_name,status from user_indexes where table_name='T';
INDEX_NAME                     STATUS
------------------------------ --------
IDX_T                          VALID

SQL> alter table t enable row movement;
Table altered.
SQL> flashback table t to scn 1170627;      ----恢复到没有创建索引之前的SCN
Flashback complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
SQL> select index_name,status from user_indexes where table_name='T';----此时索引仍然存在
INDEX_NAME                     STATUS
------------------------------ --------
IDX_T                          VALID

SQL> flashback table t to scn 1170672;  ---闪回到最后的SCN

Flashback complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
         3          3

SQL> drop index idx_t;----删除索引
Index dropped.
SQL> flashback table t to scn 1170662;-----闪回到创建索引的SCN ,但是经过闪回后索引已经不再存在了
Flashback complete.
SQL> select index_name,status from user_indexes where table_name='T';
no rows selected
SQL> 

ENABLE | DISABLE TRIGGERS
缺省情况下,闪回表时,表上的triggers是不能使用的,可以使用enable triggers来是闪回的同时启用triggers

TO BEFORE DROP Clause

Using Flashback Drop and Managing the Recycle Bin

When you drop a table, the database does not immediately remove the space associated with the table. The database renames the table and places it and any associated objects in a recycle bin, where, in case the table was dropped in error, it can be recovered at a later time. This feature is called Flashback Drop, and the FLASHBACK TABLE statement is used to restore the table. Before discussing the use of the FLASHBACK TABLE statement for this purpose, it is important to understand how the recycle bin works, and how you manage its contents.

---当你删除一张表,数据库不是立刻删除表所占的空间,数据库会重命名表并把它和相关的对象放在回收站里面,防止表被误删除之后,能够进行恢复,这个特征就叫做闪回删除,使用
flashbackup table继续表的恢复。

如果想要开启闪回删除表功能,需在数据库开始回收站功能。
SQL> alter system set recyclebin=on ;
System altered.
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      ON

回收站中的对象命名格式:

The renaming convention is as follows:

BIN$unique_id$version
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$9JC9w+cttHDgQKjAN/lQpQ==$0 T

Disabling the recycle bin does not purge or otherwise affect objects already in the recycle bin.---关闭回收站,不影响原先已经在recyclebin里面的数据。

Viewing and Querying Objects in the Recycle Bin

Oracle Database provides two views for obtaining information about objects in the recycle bin:

View Description
USER_RECYCLEBIN This view can be used by users to see their own dropped objects in the recycle bin. It has a synonym RECYCLEBIN, for ease of use.
DBA_RECYCLEBIN This view gives administrators visibility to all dropped objects in the recycle bin


删除回收站
使用purge命令能够永久的从回收站中删除对象,从回收站删除的对象就不能再用flashback命令恢复了。

语法:Purge {table |index }
语法:purge tablespace [user ]
语法:purge [USER_|DBA_]recyclebin
PURGE TABLESPACE  清除指定表空间内的所有回收站对象。存在于其他表空间的互相关联的对象也会被清除。也可以指定USER清除相应用户的对象。
--PURGE TABLESPACE example USER oe;

PURGE RECYCLEBIN  清除当前用户的所有对象。
PURGE DBA_RECYCLEBIN 清除所有对象,需要有足够的系统权限或者SYSDBA的权限。
----------------
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> drop table t;
Table dropped.
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> drop table t;
Table dropped.
SQL> select object_name,droptime from recyclebin; 

OBJECT_NAME                    DROPTIME
------------------------------ -------------------
BIN$9JC9w+cwtHDgQKjAN/lQpQ==$0 2014-03-14:22:30:10
BIN$9JC9w+cvtHDgQKjAN/lQpQ==$0 2014-03-14:22:31:10


SQL> flashback table "BIN$9JC9w+cvtHDgQKjAN/lQpQ==$0" to before drop;-----表恢复完成
Flashback complete.

SQL> select * from t;

        A          B
---------- ----------
         1          1
SQL> 

-----如何恢复索引-----
SQL> create table t(a number ,b number);
Table created.
SQL> create index idx_t on t(a);
Index created.
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
IDX_T
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
T
SQL> drop table t;

Table dropped.
SQL> select table_name from user_tables;
no rows selected
SQL> select index_name from user_indexes;
no rows selected
SQL> select object_name,original_name,type from recyclebin;----表中存在着表T和T表示的索引IDX_T

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
TYPE
-------------------------
BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0 IDX_T
INDEX
BIN$9JC9w+c4tHDgQKjAN/lQpQ==$0 T
TABLE
SQL> flashback table t to before drop;
Flashback complete.
SQL> select object_name,original_name,type from recyclebin; ----闪回之后,回收站中已经没有表和索引了
no rows selected
SQL> desc t;  ----表T已经恢复
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER

SQL> select index_name from user_indexes; ---索引也已经恢复,但是索引的名称还是原来在回收站里面的名称
INDEX_NAME
------------------------------
BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0
SQL> alter index "BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0" rename to idx_t; ---手工修改索引名称
Index altered.
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
IDX_T

SQL> 

Flashback Database命令是为了加快原本很慢的时间点数据库恢复(point in time database recovery)过程。闪回可以取得完整的数据库恢复和使用归档日志的前滚,主要目的是加快从“意外状态“中恢复。闪回数据库基于闪回日志flashback log,闪回日志包含已修改数据块的”前影像“,可用于将数据库恢复到该时间点之前的状态。闪回数据库允许复原整个数据库到具体的时间点,从而撤销该时间点以来的所有数据库的变化 用户误删除表中数据、删除表、truncate表、索引、触发器,表空间等。Dba误操作等。简而言之,所有操作都可以闪回。

Flashback Database enables you to rewind the database to a previous point in time without restoring backup copies of the datafiles.--闪回数据库能够使你在不恢复数据文件备份的情况下使数据库倒回到先去的某个时间点。
You can flash back a database from both RMAN and SQL*Plus with a single command instead of using a complex procedure.--你可以通过RMAN或者SQLPLUS来闪回数据库,替代使用复杂的过程。
使用数据库闪回可撤销导致逻辑数据损坏的变更,如果是介质丢失或者物理损坏,则必须使用传统的恢复方法进行数据库的恢复。闪回数据库不需要恢复数据文件,以此恢复数据库的数据与所需要恢复的数据条目成正比,和数据库的大小无关。闪回数据库头通过闪回日志来进行数据恢复,数据库会定期将数据快的前影像记录在闪回日志里面

Requirements for Enabling Flashback Database

The requirements for enabling Flashback Database are:

  • Your database must be running in ARCHIVELOG mode, because archived logs are used in the Flashback Database operation.

  • You must have a flash recovery area enabled, because flashback logs can only be stored in the flash recovery area.

  • For Real Application Clusters databases, the flash recovery area must be stored in a clustered file system or in ASM.

---数据库必须在归档模式下,因为在闪回数据库过程中需要有归档日志文件
--必须有闪回恢复区,闪回日志只能存放在flash recovery area里面
--在rac模式下,闪回恢复区必须存在在一个集群文件系统

首先开启数据库归档模式
SQL> startup mount;
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              83887504 bytes
Database Buffers          226492416 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.

SQL> archive log list
Database log mode              Archive Mode  --归档模式
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     29--最老的在线日志
Next log sequence to archive   31--将要归档的日志
Current log sequence           31 ---当前日志
SQL> alter database open;
Database altered.
SQL> select SEQUENCE#,STATUS from v$log;

 SEQUENCE# STATUS
---------- ----------------
        31 CURRENT---当前日志
        29 INACTIVE
        30 INACTIVE

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/arch' scope=spfile;  --修改归档日志的目录
System altered.
SQL> show parameter log_archive_format
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_format                   string      %t_%s_%r.dbf

%s: 日志序列号:

%t: 重做线程编号.

%d: 数据库ID

%r RESETLOGSID.



设置闪回数据库参数
设置数据库闪回的三个参数:
db_recovery_file_dest_size  闪回恢复区大小
db_recovery_file_dest  闪回恢复区路径,该参数可以任意指定,闪回日志记录了数据库的前影像,该日志不会进行归档,一但停用数据库的闪回功能,该目录下的日志会
自动清除
db_flashback_retention_target  保留恢复最近多长时间的数据,单位为分钟。
SQL> alter system set db_recovery_file_dest_size=5G;
System altered.
SQL> alter system set db_recovery_file_dest='/home/oracle/flash';
System altered.
SQL> alter system set db_flashback_retention_target=2440;  --分钟  2天,系统默认是1天
System altered.

开启数据库闪回功能
SQL> startup mount
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              75498896 bytes
Database Buffers          234881024 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES

闪回数据库语法:


v$flashback_database_stat--用于监视闪回数据库日志中记录闪回数据的开销,包含24小时的信息,每行代表一个小时的时间间隔,可以确定数据生成的变化,
FLASHBACK_DATA和REDO_DATA分别表示时间间隔内写入的闪回字节数和重做日志字节数
v$flashback_database_log---记录闪回日志信息,包括最早可以回复的SCN,闪回日志的大小
v$flash_recovery_area_usage---监控闪回恢复区的使用情况
基于SCN的闪回,有两只方式 SQL和RMAN

---------------------
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
-----------------------
                 1242503
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
-----------------------
                 1242520
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1242533
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              75498896 bytes
Database Buffers          234881024 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> flashback database to scn 1242503;----闪回到第一次commit的时候
Flashback complete.
SQL> alter database open resetlogs;
Database altered.
SQL> select * from t;  ---闪回数据库测试正常
         A          B
---------- ----------
         1          1
SQL> 
---------------------------------------
TO timestamp---例子
 flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');


小结:

    oracle10g数据库提供了闪回功能,无论对开发人员,还是DBA人员提供了便捷的处理逻辑数据丢失的处理方法,非常实用。


 打开或关闭oracle数据库的闪回功能步骤 
一、打开闪回数据库特性:
1、确保数据库处于归档模式,如果为非归档模式,将数据库转换成归档模式
SQL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            /cwarch
最早的联机日志序列     1274
下一个存档日志序列   1276
当前日志序列           1276


2、设置闪回恢复区
设置闪回区大小:
SQL> alter system set db_recovery_file_dest_size=80g scope=spfile;
设置闪回区位置:
SQL> alter system set db_recovery_file_dest='/workdb/account_flashback_area' scope=spfile;
设置闪回目标为5天,以分钟为单位,每天为1440分钟:
SQL> alter system set db_flashback_retention_target=7200 scope=spfile;


3、打开闪回功能
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter database open;


4、确认数据库闪回特性已经启用
SQL> select flashback_on from v$database;


FLASHBACK_ON
------------------
YES






二、关闭闪回数据库特性:
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback off;
SQL> alter database open;




Oracle 11G 闪回技术 使用Oracle闪回查询 

使用带有AS OF子句的SELECT语句进行闪回查询。闪回查询获取之前的时间点的数据。

语句通过时间戳或SCN显示地引用过去的时间。返回在那个时间点当时已经提交的数据。

闪回查询的使用包括:

1. 恢复丢失的数据、撤销不正确的且已经提交的改变。例如,如果你错误地删除或更新了行并且提交了,可以立即撤销这个错误。

2. 比较当前的数据和早些时候的数据。例如,可以运行一个日报表,来显示数据从昨天到今天的变化。

可以比较单独的行;也可以查看行集合的交集和并集。

3. 查看事务数据在特定的时间的状态。例如,可以验证某一天的帐户余额。

4. 通过消除存储一些类型的临时数据所需要,简化应用程序的设计。Oracle允许你直接从数据库获取过去的数据。

5. 对过去的数据应用打包的应用,例如报告产生工具。

6. 为应用提供了错误改正的自我服务,允许用户undo和改变他们的错误。

示例A. 检查和还原过去的数据
假设12:30 PM发现员工Chung所对应的数据行被从employees表中删除了。并且你知道在9:30 AM时,Chung的数据在数据库中是正常的。可以使用闪回查询来查看在9:30 AM时表中的内容,来找到丢失的数据。如果需要,可以还原数据。

使用闪回查询获取丢失的行

使用闪回查询还原丢失的行


Oracle闪回查询指导

1. 可以对每个表指定或省略AS OF子句,对不同的表指定不同的次数。

注意:如果一个表是闪回数据归档,并且指定了时间比它创建的时间还要早,则查询会返回0行,而不会引起错误。

2. 可以在查询中使用AS OF子句来执行DDL操作(例如创建和截断表),

也可以用来在和闪回查询相同的会话中执行DML操作(INSERTDELETE)。

3. 在影响数据库当前状态的DDL语句或DML语句中使用闪回查询的结果,

可以在INSERTCREATE TABLE AS SELECT语句中使用AS OF子句。

4. 如果在应用中,这种3秒钟的误差对于闪回查询是重要的,则使用SCN而不是时间戳。

5. 可以使用创建视图引用过的数据,即在视图定义的SELECT语句中使用AS OF子句。

如果指定一个相对时间,即从数据库主机的当前时间减去,则对于每个查询,时间要重新计算。

6. 可以在自连接或集合操作中使用AS OF子句,来提取和比较来自于不同时间的数据。

可以通过在闪回查询之前加上CREATE TABLE AS SELECTINSERT INTO TABLE SELECT,来存储闪回查询的结果。











Oracle flashback drop

导读

在实施项目时,经常会有同事、客户出于疏忽,将部分记录删除、表初始化、表删除等异常操作。出现这种情况,往往很紧张。有备份的话,可能心里还有点安慰,顶多就是工作量耗时多些。但要是没备份呢?心里可能就是六神无主了。毕竟,这是丢数据了。不论如何,在特殊时期,要比正常时期更需要保持冷静的心态。如果不冷静,可能你会将异常一步一步的推向极端而不再可能回到从前;如果冷静下来,有些事情还是有回天之术,至少可以保证将损失降低到最低。

本文主要针对Oracle推出flashback drop技术作一些简单说明并提供示例。更多的flashback技术,我们将陆续推出。除特殊说明,本文均是以oracle 10g R2作为示例版本数据库。

1. 回收站

要想了解flashback drop技术,不得不先提下回收站(recycle bin)技术。

1.1、回收站概念

回收站实际上是一张包含有被删除对象信息的数据字典表。表以及关联的任何对象譬如索引、约束、嵌套表等等如果被删除了,oracle是不会立即删除这些对象,这些对象都将继续占用空间。直到显式地purge回收站内的对象或者由于表空间容量限制由数据库自动清理空间时,被删除对象才会被彻底的removed。换句话说,oracle drop操作其实是一个重命名的操作。

每一个用户都可以被认为拥有自己的一个回收站,但是,拥有sysdba权限的用户除外。

用户可以通过以下语句查看用户回收站的内容:

SQL> SELECT * FROM RECYCLEBIN;

关于回收站,有几个注意点及例外:

1)   当删除表空间及其文件时,该表空间内的内容是不会存放进回收站中;

2)   当删除表空间及其文件时,回收站中属于该表空间的所有被删除的对象将被清除;

3)   当删除某个用户时,该用户的任何对象不会存放进回收站中,以及在回收站中属于该用户的任何对象将被删除;

4)   当删除一个cluster时,成员表将不会存放进回收站中,以及在回收站中属于该cluster的被删除的成员表将被删除;

5)   当删除一个type时,任何依赖对象(子type)将不会存放进回收站中,以及在回收站中与该type相依赖的对象将被删除。

1.2、回收站内对象的命名

为了避免命名冲突,被删除的表及其相关对象,在回收站中会由系统自动产生一个唯一的名字。因为在以下情况下会可能出现命名冲突的情况:

?  用户删除一个表,然后创建一张同名的表,再删除;

?  两个用户拥有同名的表,且同时删除;

为了解决上述重名冲突问题,回收站将以特定格式,为每个被删除的对象命名。

格式如下:

BIN$unique_id$version

其中:

?  BIN:固定谓词,表示该对象为回收站内对象;

?  unique_id:由26个字符构成的全局唯一标识id,该id将确保回收站内对象名在整个数据库的唯一性;

?  version:数据库分配的版本号;

示例:

TARWEN@orcl>select object_name from recyclebin;

 

OBJECT_NAME

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

BIN$3xRs0jFlJHjgQBCsEwIw0g==$0

1.3、回收站功能的启用与停止

只有回收站功能启用之后,被删除的对象才会存放在回收站之内;如果将回收站功能禁用,被删除的对象将不会存放在回收站之内;

可以通过初始化参数recyclebin来配置回收站功能是否启用,默认情况,回收站功能是启用的。

1)   通过以下语句来启用回收站功能:

SQL> alter system set recyclebin=on

2)   通过以下语句来禁用回收站功能

SQL> alter system set recyclebin=off

注:

1)        将回收站功能禁用之后,不会对回收站内的对象作清除或者其它方面的操作;

2)        上述语句执行后立即生效。

 1.4、清空回收站内的对象

可以通过purge命令来永久清除回收站内对象,并释放其占用的空间。purge回收站内的对象,需要的权限与drop回收站内原始对象的权限一致。

purge回收站内对象信息,可以通过以下方式:

1)   采用回收站内原始对象名。如表名为T的原始名称。

TARWEN@orcl>show recyclebin;

ORIGINAL NAME     RECYCLEBIN NAME                   OBJECT TYPE   DROP TIME

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

T                    BIN$3xRs0jFpJHjgQBCsEwIw0g==$0 TABLE          2013-06-14:09:49:17

TARWEN@orcl>purge table t;

Table purged.

2)   采用回收内对象名。如:回收站内名为“BIN$3xRs0jFlJHjgQBCsEwIw0g==$0”的对象

TARWEN@orcl>show recyclebin;

ORIGINAL NAME     RECYCLEBIN NAME                    OBJECT TYPE  DROP TIME

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

T                   BIN$3xRs0jFpJHjgQBCsEwIw0g==$0  TABLE         2013-06-14:09:49:17

TARWEN@orcl>purge table "BIN$3xRs0jFpJHjgQBCsEwIw0g==$0";

Table purged.

注:采用回收内对象名删除对象信息,对象名需用引号引起,否则语句执行失败。

3)   通过指定表空间,来删除属于某表空间中所有回收站对象信息。

TARWEN@orcl>purge tablespace tarwen;

Tablespace purged.

4)   通过指定表空间指定用户,来删除表空间中属于某个用户的所有回收站对象信息。

TARWEN@orcl>purge tablespace tarwen user tarwen;

Tablespace purged.

5)   删除整个回收站内的对象信息,释放空间

TARWEN@orcl>purge recyclebin;

Recyclebin purged.

注:

1)   如果回收站内信息很多,该操作会对系统性能影响较大;

2)   如果拥有sysdba权限,则使用dba_recyclebin替换recyclebin;

3)   也可以通过purge指定index来清除回收站内被删除的索引对象信息。

2. flashback drop

flashback drop功能提供一个由于意外删除表的还原方式,当表被意外删除,oracle将该表及其相依赖对象存放在回收站中。除非用户决定永久清除回收站内的信息或者由于空间因素需要释放空间,否则被删除的对象将一直存放在回收站内,回收站其实是一个虚拟容器,该容器内的对象均可以通过flashback drop的功能还原。

2.1、使用flashback drop功能的前提

执行flashback drop功能的用户,需要有删除在回收站内相应对象的执行权限。

2.2、从回收站内还原已删除的表

可以通过以下语句将回收站中的表还原:

SQL> flashback table <表名> to before drop

其中,表名可以指定原始表名,也可以通过指定回收站中的对象名。

示例1:

TARWEN@orcl>FLASHBACK TABLE t TO BEFORE DROP;

Flashback complete.

此外,可以通过rename选项,将回收站的对应的对象还原为一个新的对象名:

SQL> flashback table <表名> to before drop rename to <新表名>

示例2:

TARWEN@orcl>FLASHBACK TABLE t TO BEFORE DROP RENAME TO t1;

Flashback complete.

另外,如果一个重名的表被删除了,此时可以通过回收站的对象名执行闪回,如果使用原始名闪回,那依据“后进先出”的原则,对对象执行闪回。

示例3:

TARWEN@orcl>show recyclebin;

ORIGINAL NAME        RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

T                   BIN$3xUOCKWEfVTgQBCsEwIxhg==$0 TABLE          2013-06-14:11:07:28

T                   BIN$3xUOCKV/fVTgQBCsEwIxhg==$0 TABLE          2013-06-14:11:06:59

TARWEN@orcl>flashback table t to before drop;

Flashback complete.

TARWEN@orcl>show recyclebin;

ORIGINAL NAME        RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

T                   BIN$3xUOCKV/fVTgQBCsEwIxhg==$0           TABLE     2013-06-14:11:06:59

2.3、 flashback drop关联的对象

当从回收站中flashback一个表之后,相关联的对象(如索引)也会被闪回,但闪回回去之后,原始对象名不会被闪回,而是回收站内的对象名被闪回。如:假设T表被删除,其依赖的索引T_IDX也被drop,drop之后产生的回收站对象名为“BIN$3xUOCKV/fVTgQBCsEwIxhg==$0”,如果采用flashback将T表闪回到删除之前,那么索引名将不再是“T_IDX”而是变为"BIN$3xUOCKV/fVTgQBCsEwIxhg==$0"

如果需要使用原始的依赖对象名(索引名),那么则需要手工rename。此外,在flashback依赖对象之前,需要对相关联的依赖对象的回收站名作记录,以便手工修改闪回之后的对象名。

示例4:

1)   表employees被删除,查看回收站相关对象信息:

TARWEN@orcl>select object_name,original_name,type,createtime from recyclebin;

OBJECT_NAME                     ORIGINAL_NAME    TYPE                      CREATETIME

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

BIN$3xUOCKWMfVTgQBCsEwIxhg==$0 EMP_EMAIL_UK    INDEX                     2013-06-13:14:53:28

BIN$3xUOCKWLfVTgQBCsEwIxhg==$0 EMP_EMP_ID_PK   INDEX                     2013-06-13:14:52:34

BIN$3xUOCKWNfVTgQBCsEwIxhg==$0  EMPLOYEES       TABLE                     2013-06-13:14:50:31

2)   flashback employees表

TARWEN@orcl>flashback table employees to before drop;

Flashback complete.

3)   查看flashback之后的employees表关联对象信息

TARWEN@orcl>SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME ='EMPLOYEES';

INDEX_NAME

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

BIN$3xUOCKWLfVTgQBCsEwIxhg==$0

BIN$3xUOCKWMfVTgQBCsEwIxhg==$0

4)   对闪回之后的关联对象名执行手工rename

TARWEN@orcl>ALTER INDEX "BIN$3xUOCKWLfVTgQBCsEwIxhg==$0" RENAME TO emp_emp_id_pk;     --索引重命名

Index altered.

 

TARWEN@orcl>ALTER INDEX "BIN$3xUOCKWMfVTgQBCsEwIxhg==$0" RENAME TO emp_email_uk;      --索引重命名

Index altered.

TARWEN@orcl>ALTER TABLE employees RENAME CONSTRAINT "BIN$3xUOCKWJfVTgQBCsEwIxhg==$0" TO emp_emp_id_pk;  --约束重命名

Table altered.

TARWEN@orcl>ALTER TABLE employees RENAME CONSTRAINT "BIN$3xUOCKWKfVTgQBCsEwIxhg==$0" TO emp_email_uk;   --约束重命名

Table altered.

2.4、flashback drop功能限制

针对flashback drop功能,oracle也是有一定的限制和例外的:

1)   recycle bin功能仅对非system表空间,本地管理表空间可用。但如果某表是在非system表空间,且是本地管理的表空间,而该表相依赖的一个或者多个对象是在字典管理表空间中,此时,这些对象也会受到recycle bin保护;

2)   recycle bin空间分配没有一个固定的值,且无法确保被删除对象能在recycle bin中保留多少时间。对象在recycle bin中保留时间最主要的是取决于系统的活动程度;

3)   oracle允许用户对recycle bin内的对象执行查询操作,但不允许执行DML、DDL语句。如果对回收站内的对象执行DML、DDL语句,则报ORA-38301的错误:

ORA-38301: can not perform DDL/DML over objects in Recycle Bin

    同时,会在alert日志中记录相关的日志:

performing DML/DDL operation over object in bin.

performing DML/DDL operation over object in bin.

4)   可以对recycle bin内的表对象使用回收站名执行flashback query操作,但不允许采用对象的原始名执行该操作;

5)   当drop表时,与该表相关的所有对象(索引(不含位图连接索引)、LOB段、嵌套表、触发器、约束等)都将被存放在recycle bin中。同样,当你执行flashback drop,这些相关对象也将一起被恢复。但是,会有这么一种可能,那就是部分相关对象譬如索引之类的可能会因为空间首先因素而被回收利用,在这种情况下,这类对象是无法从recycle bin中恢复的;

6)   出于安全考虑,采用FGA(细粒度审计)以及VPD(虚拟私有数据库)策略定义的表的删除,将不受recycle bin保护;

7)   分区索引组织表的删除,将不受recycle bin保护;

8)   recycle bin将不保护外键约束,虽然其它类型的约束会受到保护,如果一张表在删除之前有外键约束,但是当使用flashback drop功能恢复该表之后,请重建创建所有外键约束;

9)   当drop表时,在该表上定义的所有物化视图日志也会被删除,但不受recycle bin保护。因此,采用flashback drop功能恢复该表时,物化视图日志是无法被闪回的;

10)  当drop表时,表中的所有索引都随着表被drop且受到recycle bin的保护。如果随后表空间压力上升,数据库将优先清除recycle bin中的索引,释放该空间。在这种情况下,当flashback drop表时,部分索引是无法被恢复的;

11)  无论是由于用户或者数据库进行的空间释放而清除recycle bin中的对象操作,针对被清除的对象,是无法通过flashback drop功能恢复;

12)  除了位图连接索引和域索引,oracle数据库将恢复被删除表上定义的所有索引。当drop表时,位图连接索引和域索引都不会受到recycle bin保护,因此无法恢复;

13)  当采用drop table...purge语句删除表时,表以及相关联的对象将被彻底删除,不再受到recycle bin保护。

3. 小结

综上,我们简述了当数据库出现误删除表时的一种恢复技术。如果读者遇到了类似的问题,记住:请冷静。冷静的思考下你所做的操作以及带来的影响。






11g新特性--Oracle 11g 闪回数据归档 

  虽然ORA-01555错误可以通过种种手段来避免和减少,但是随着时间的流逝,这些UNDO信息总会失去,那么能否将这些信息保存起来,使得数据库在一定的历史周期之内可以不断向后追溯,使得我们可以看到一个数据表在任意历史时间点上的切片呢?

 

     从Oracle Database 11g开始,Oracle 提供了一个这样的功能:闪回数据归档(Flashback Data Archive)。通过这一功能Oracle数据库可以将UNDO数据进行归档,从而提供全面的历史数据查询,也因此Oracle引入一个新的概念Oracle Total Recall也即Oracle全面回忆功能。闪回数据归档可以和我们一直熟悉的日志归档类比,日志归档记录的是Redo的历史状态,用于保证恢复的连续性;而闪回归档记录的是UNDO的历史状态,可以用于对数据进行闪回追溯查询;后台进程LGWR用于将Redo信息写出到日志文件,ARCH进程负责进行日志归档;在Oracle 11g中,新增的后台进程FBDA(Flashback Data Archiver Process)则用于对闪回数据进行归档写出:

[oracle@sp3: ~]$ps -ef | grep fbda | grep -v grep 
oracle    3251     1  0 Jan07 ?        00:00:11 ora_fbda_ccdb

闪回归档数据甚至可以以年为单位进行保存,Oracle可以通过内部分区和压缩算法减少空间耗用,这一特性对于需要审计以及历史数据分区的环境尤其有用,但是注意,对于繁忙的数据库环境,闪回数据存储显然要耗用更多的存储空间。当然,用户可以根据需要,对部分表进行闪回数据归档,从而满足特定的业务需求。

因为闪回数据归档需要独立的存储,所以在使用该特性之前需要创建独立的ASSM(自动段空间管理)表空间:

sys@TQGZS11G> create tablespace fbda datafile '/oracle/oradata/tqgzs11g/FBDA.dbf' size 200M segment space management auto;
Tablespace created.

然后可以基于该表空间创建闪回数据归档区,FLASHBACK ARCHIVE ADMINISTER系统权限是创建闪回数据存档所必需的,此处使用SYS用户进行:

sys@TQGZS11G> create flashback archive fda tablespace fbda retention 1 month;
Flashback archive created.

此后就可以使用该归档区来记录数据表的闪回数据量。为了测试方便,先将UNDO表空间更改为较小,以使得UNDO数据能够尽快老化:

sys@TQGZS11G> create undo tablespace UNDOTBS2_SMALL datafile '/oracle/oradata/tqgzs11g/UNDOTBS2_SMALL.dbf' size 20M autoextend off;
Tablespace created.
sys@TQGZS11G> alter system set undo_tablespace= UNDOTBS2_SMALL;
System altered.
sys@TQGZS11G> show parameter undo
NAME                                 TYPE                           VALUE
------------------------------------ ------------------------------ ------------------------------
undo_management                      string                         AUTO
undo_retention                       integer                        900
undo_tablespace                      string                         UNDOTBS2_SMALL

接下来使用测试用户连接,对测试表执行闪回归档设置,FLASHBACK ARCHIVE对象权限是启用历史数据跟踪所必需的:

sys@TQGZS11G> conn tq/tq
Connected.
tq@TQGZS11G> select TABLE_NAME from user_tables;
TABLE_NAME
--------------------
T
EMP
tq@TQGZS11G> alter table t flashback archive fda;
Table altered.

取消对于数据表的闪回归档可以使用如下命令:

alter table table_name no flashback archive;

接下来记录一下SCN,从数据库表中删除部分数据:

tq@TQGZS11G> select dbms_flashback.get_system_change_number from dual;   
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1142115
tq@TQGZS11G> select count(*) from t;
  COUNT(*)
----------
     69266
tq@TQGZS11G> delete from t where rownum < 1001;
1000 rows deleted.
tq@TQGZS11G> commit;
Commit complete.

现在执行闪回查询,则数据来自UNDO表空间:

tq@TQGZS11G> select count(*) from t as of scn 1142115;
  COUNT(*)
----------
     69266
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |  1048   (1)| 00:00:13 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 69266 |  1048   (1)| 00:00:13 |
-------------------------------------------------------------------

接下来执行一小段批量循环代码,使UNDO数据老化覆盖:

tq@TQGZS11G> begin
  2  for i in 1 .. 100 loop
  3  delete from t where rownum < 31;
  4  commit;
  5  end loop;
  6  end;
  7  /
PL/SQL procedure successfully completed.

现在来看一下闪回数据归档发挥作用的闪回查询,通过执行计划能够看到和之前查询执行方式的不同:

tq@TQGZS11G> select count(*) from t as of scn 1142115;
  COUNT(*)
----------
     69266
Execution Plan
----------------------------------------------------------
Plan hash value: 1421074822
----------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                    |     1 |       |  1151   (1)| 00:00:14 |       |       |
|   1 |  SORT AGGREGATE           |                    |     1 |       |            |          |       |       |
|   2 |   VIEW                    |                    | 20633 |       |  1151   (1)| 00:00:14 |       |       |
|   3 |    UNION-ALL              |                    |       |       |            |          |       |       |
|   4 |     PARTITION RANGE SINGLE|                    | 20295 |   515K|    69   (2)| 00:00:01 |     1 |     1 |
|*  5 |      TABLE ACCESS FULL    | SYS_FBA_HIST_72661 | 20295 |   515K|    69   (2)| 00:00:01 |     1 |     1 |
|*  6 |     FILTER                |                    |       |       |            |          |       |       |
|*  7 |      HASH JOIN OUTER      |                    |   338 |   669K|  1081   (1)| 00:00:13 |       |       |
|*  8 |       TABLE ACCESS FULL   | T                  |  3463 | 41556 |  1048   (1)| 00:00:13 |       |       |
|   9 |       VIEW                |                    | 19522 |    37M|    32   (0)| 00:00:01 |       |       |
|* 10 |        TABLE ACCESS FULL  | SYS_FBA_TCRV_72661 | 19522 |    37M|    32   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - filter("ENDSCN">1142115 AND "ENDSCN"<=1145328 AND ("STARTSCN" IS NULL OR "STARTSCN"<=1142115))
   6 - filter("F"."STARTSCN"<=1142115 OR "F"."STARTSCN" IS NULL)
   7 - access("T".ROWID=CHARTOROWID("F"."RID"(+)))
   8 - filter("T"."VERSIONS_STARTSCN" IS NULL)
  10 - filter(("ENDSCN" IS NULL OR "ENDSCN">1145328) AND ("STARTSCN" IS NULL OR "STARTSCN"<1145328))
Note
-----
   - dynamic sampling used for this statement

通过以上执行计划可以看到,查询闪回来自SYS_FBA_TCRV_72661系统表,该表隶属于闪回归档表空间,用于记录闪回数据:

tq@TQGZS11G> desc SYS_FBA_TCRV_72661
Name              Null?    Type
----------------- -------- ---------------------
RID                        VARCHAR2(4000)
STARTSCN                   NUMBER
ENDSCN                     NUMBER
XID                        RAW(8)
OP                         VARCHAR2(1)
tq@TQGZS11G> select count(*) from SYS_FBA_TCRV_72661;
  COUNT(*)
----------
     18511

闪回功能生成的字典对象有多个,通过查询USER_TABLES/USER_OBJECTS视图可以获得这些对象的详细信息:

tq@TQGZS11G> select table_name,tablespace_name from user_tables where table_name like '%FBA%';
TABLE_NAME                     TABLESPACE_NAME
------------------------------ --------------------
SYS_FBA_DDL_COLMAP_72661       FBDA
SYS_FBA_TCRV_72661             FBDA
SYS_FBA_HIST_72661
tq@TQGZS11G> select object_name,object_type from user_objects where object_name like '%FBA%';
OBJECT_NAME                    OBJECT_TYPE
------------------------------ --------------------
SYS_FBA_DDL_COLMAP_72661       TABLE
SYS_FBA_HIST_72661             TABLE
SYS_FBA_HIST_72661             TABLE PARTITION
SYS_FBA_TCRV_72661             TABLE
SYS_FBA_TCRV_IDX_72661         INDEX

可以通过数据字典视图来查看关于闪回归档表的记录:

tq@TQGZS11G> select * from user_flashback_archive_tables;                                    
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME         ARCHIVE_TABLE_NAME
---------- ---------- ------------------------------ --------------------
T          TQ         FDA                            SYS_FBA_HIST_72661

可以通过dict字典查询和闪回归档有关的数据字典表:

sys@TQGZS11G> select table_name from dict where table_name like '%FLASHBACK_ARCHIVE%';
TABLE_NAME
-----------------------------------
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES

总之,闪回数据归档是Oracle 11g提供的重要增强之一,通过合理使用这一增强,可以为数据库提供更为全面的数据生命周期管理,Oracle关于UNDO技术的进化至此又迈进了重要的一步。

- The End -

 

简单整理后的主要步骤如下:

oracle11g 启动闪回功能

1、创建独立的ASSM(自动段空间管理)表空间。
create tablespace fbda datafile'/oracle/oradata/orcl/FBDA.dbf' size 1000M segment space management auto;

2、在独立的ASSM上创建闪回数据归档区。
create flashback archive fda tablespace fbda retention 1 month;

3、对指定的数据表执行闪回数据归档设置。
alter table t flashback archive fda;

4、取消对于表数据的闪回归档设置
alter table table_name no flashback archive;

通过闪回功能找回删除的数据
select dbms_flashback.get_system_change_number from dual;
select count(*) from t as of scn 1142115



闪回数据归档:
概览
闪回数据归档是一种历史记录数据存储。Oracle Database 11g通过新的闪回数据归档后台进程FBDA自动跟踪和归档启用了闪回数据归档的表中的数据。使用此功能可满足超过还原保留期的长期保留要求。闪回数据归档可确保闪回查询能够获得对数据库对象版本的SQL 级别访问权限,而不会出现快照太旧的错误。
闪回数据归档由一个或多个表空间(或其中的几部分)组成。您可以拥有多个闪回数据归档。每个闪回数据归档都具有特定的保留持续时间。您应根据保留持续时间的要求创建不同的闪回数据归档,例如,为必须保留一年的所有记录创建一个闪回数据归档,为必须保留两年的所有记录创建另一个闪回数据归档等。
FBDA将异步收集原始数据并将其写入闪回数据归档。它并不包括原始索引,因为检索历史记录信息的模式与检索当前信息的模式可能大不相同。
注:可能需要针对历史记录查询持续时间创建适合的索引。
闪回数据归档比较
闪回数据归档技术与闪回数据库的比较:
? 使用闪回数据归档可以访问任意时间点的数据,而不会实际更改当前数据。这与闪回
数据库相反,闪回数据库会使数据库实际返回到某个时间点。
? 必须启用跟踪才能访问历史记录,而闪回数据库需要预配置。闪回数据库属于脱机操
作,需要资源。闪回数据归档属于联机操作(历史记录访问与当前访问无缝共存)。
由于使用了新的后台进程,所以它对现有的进程几乎没有影响。
? 闪回数据归档在表级别启用,而闪回数据库只能在数据库级别运行。
? 使用闪回数据归档,可以返回到一个表的不同行或多个不同表的多个不同时间点,而
使用闪回数据库则只能返回到特定调用的一个时间点。
闪回数据归档:
体系结构
闪回数据归档后台进程(FBDA) 随数据库启动。
1.FBDA首先对缓冲区高速缓存中的还原数据执行操作。
2.如果还原数据已不在缓冲区高速缓存中,FBDA也可以从还原段读取所需值。
3.FBDA将合并启用了闪回归档的表中的修改行,并将其写入相应的历史记录表,这些表将组成闪回数据归档。
可以通过查询*_FLASHBACK_ARCHIVE_TABLES视图查找历史记录表的内部分配名称。历史记录表是压缩的数据,并已在内部进行了分区。
数据库将在保留期到期后的第一天自动清除所有历史记录信息(删除数据,而不破坏闪回数据归档)。例如,如果保留期为10 天,则会在每10 天后的第一天删除最旧的信息,在归档中仅保留10 天的信息。这是实现数字粉碎的一种方法。
准备数据库
要启用闪回数据归档,执行下列任务:
为数据归档创建一个或多个表空间,并对“归档管理员”授予访问权限和适合的限额。
同时,为归档管理员授予FLASHBACK ARCHIVE ADMINISTER系统权限,允许其执行下列语句:
? CREATE FLASHBACK ARCHIVE
? ALTER FLASHBACK ARCHIVE
? DROP FLASHBACK ARCHIVE
要允许特定用户使用特定闪回数据归档,请为归档用户授予对该闪回数据归档的FLASHBACK ARCHIVE对象权限。这样,归档用户可以使用特定闪回数据归档对表启用闪回归档。
以归档管理员身份执行以下示例:
GRANT FLASHBACK ARCHIVE ON FLA1 TO HR;
用户很有可能会使用其它闪回功能。要允许在查询期间访问特定对象,授予对查询涉及的所有对象的FLASHBACK和SELECT权限。
如果用户需要访问DBMS_FLASHBACK程序包,则需要为他们授予对此程序包的SELECT权限。这样,用户就可以使DBMS_FLASHBACK.ENABLE和DBMS_FLASHBACK.DISABLE过程来启用或禁用闪回数据归档。
配置还原:
– 创建还原表空间(默认设置为:可自动扩展的表空间)
– 启用自动还原管理(11g的默认设置)
– 了解还原的自动优化:
— 固定大小的表空间:可获得最佳保留期的自动优化
— 可自动扩展的还原表空间:可获得运行时间最长的查询的自动优化
– 建议对闪回使用以下设置:固定大小的还原表空间
Oracle Database 11g使用下列默认数据库初始化参数:
? UNDO_MANAGEMENT='AUTO'
? UNDO_TABLESPACE='UNDOTBS1'
? UNDO_RETENTION=900
换句话说,默认情况下启用自动还原管理。可自动扩展的还原表空间基于数据库安装而创建。
? 对于固定大小的还原表空间,Oracle DB 会自动优化系统,以便为还原表空间提供可能的最佳还原保留期。
? 对于可自动扩展的还原表空间(默认),Oracle DB 会保留还原数据,其保留时间至少满足运行时间最长的查询所需的保留期,以及UNDO_RETENTION参数指定的还原保留期阈值。
使用固定大小的还原表空间,自动优化还原保留期通常会产生较好的结果。如果由于此原因或其它原因而希望将还原表空间更改为固定大小,还原指导可帮助您确定要分配的正确固定大小。
如果不能确定空间要求或者无法访问还原指导,请执行以下步骤:
1.以可自动扩展的还原表空间开始。
2.在一个业务循环(例如,1 天或2 天或更长时间)中观察它。
3.使用V$UNDO_STAT视图收集还原块信息,计算空间要求,并使用它们创建大小适合的固定还原表空间(《Oracle 数据库管理员指南》中提供了计算公式)。
4.查询V$UNDOSTAT.TUNED_UNDORETENTION以确定对于当前还原表空间还原数据的保留持续时间。设置UNDO_RETENTION参数并不能保证未到期的还原数据不会被覆盖。如果系统需要较多的空间,Oracle DB 可以用最新生成的还原数据覆盖未到期的还原数据。
- 为还原表空间指定RETENTION GUARANTEE子句,以确保不会丢弃未到期的还原数据。
- 为了满足超过还原保留期的长期保留要求,可创建闪回数据归档。
闪回数据归档:
工作流
第一步是创建闪回数据归档。闪回数据归档由一个或多个表空间组成。您可以拥有多个闪回数据归档。
第二步是为系统指定默认的闪回数据归档,该步骤是可选的。闪回数据归档配置有保留时间。将在此保留时间内保留在闪回数据归档中归档的数据。
在第三步中,可以对表先启用闪回归档(然后再禁用它)。对表启用闪回归档时,系统不允许对该表执行某些DDL 语句。默认情况下,不对任何表启用闪回归档。
在第四步中,查看闪回数据归档数据。当查询的数据超过了可能的还原保留期时,会以透明方式重新编写该查询以使用闪回数据归档中的历史记录表。
使用闪回数据归档
访问历史记录数据的基本工作流:
1.创建闪回数据归档:
CREATE FLASHBACK ARCHIVE fla1
TABLESPACE tbs1 QUOTA 10G RETENTION 5 YEAR;
2.对FLA1归档中的表启用历史记录跟踪:
ALTER TABLE inventory FLASHBACK ARCHIVE fla1;
3.查看历史记录数据:
SELECT product_number, product_name, count
FROM inventory AS OF TIMESTAMP TO_TIMESTAMP
('2007-01-01 00:00:00', 'YYYY-MM-DDHH24:MI:SS');
使用CREATE FLASHBACK ARCHIVE语句创建闪回数据归档。
? 可以为系统指定默认的闪回数据归档(可选)。如果省略此选项,则以后仍可以将此闪回数据归档指定为默认选项。
? 需要提供闪回数据归档的名称。
? 需要提供闪回数据归档的第一个表空间的名称。
? 可以确定表空间中闪回数据归档可以使用的最大空间量。默认设置是不受限制。如果第一个表空间中的空间限额不是无限制的,则必须指定该值,否则会引发ORA-55621。
? 需要提供保留时间(表的闪回数据归档数据的保留天数)。
创建并使用闪回数据归档的基本工作流只包含三个步骤:
1.归档管理员创建名为fla1的闪回数据归档,这最多占用10 GB 的tbs1表空间,其中的数据会保留五年。
2.在第二步中,归档用户启用闪回数据归档。如果自动还原管理处于禁用状态,则在试图修改表时会出现错误ORA-55614。
3.第三步使用AS OF查询显示所访问的历史记录数据。
配置默认闪回数据归档
使用默认闪回归档:
1.创建默认闪回数据归档:
CREATE FLASHBACK ARCHIVE DEFAULT fla2
TABLESPACE tbs1 QUOTA 10G RETENTION 2 YEAR;
2.对表启用历史记录跟踪:
ALTER TABLE stock_data FLASHBACK ARCHIVE;
注:因为使用了默认的闪回数据归档,所以不需要提供闪回数据归档名称。
3.禁用历史记录跟踪:
ALTER TABLE stock_data NO FLASHBACK ARCHIVE;
配置默认闪回数据归档
在FLASHBACK ARCHIVE子句中,可以指定将在其中存储表的历史记录数据的闪回数据归档。默认情况下,系统没有闪回数据归档。在前面的示例中,为系统指定了默认闪回数据归档。
可使用以下两种方式之一创建默认闪回归档:
? 在ALTER FLASHBACK ARCHIVE语句的SET DEFAULT子句中,指定现有闪回数据归档的名称。
? 创建闪回数据归档时,CREATE FLASHBACK ARCHIVE语句中包含DEFAULT。
可使用ALTER TABLE命令对表启用和禁用闪回归档。可通过指定闪回数据归档名称将内部归档表分配给特定闪回数据归档。如果省略了名称,将使用默认闪回数据归档。指定NO FLASHBACK ARCHIVE可禁用表归档。
填充闪回数据归档空间
闪回数据归档填满后,会发生什么?
? 空间使用率达到90%
? 引发错误:
– ORA-55623 "FlashbackArchive \"%s\" is blocking and tracking on all tables is suspended"
– ORA-55617 "Flashback Archive \"%s\" runs out of space and tracking on \"%s\" is suspended"
? 生成预警日志条目
? 挂起跟踪
填充闪回数据归档空间
用尽闪回数据归档中的空间后,FBDA及所有生成跟踪还原的前台进程会引发ORA-55617或ORA-55623错误。会增加一个预警日志条目,表明“闪回归档fla1 已满,归档已挂起。\n”默认情况下,分配空间的使用率达到90% 后即会发生此错误。
示例:
? 55623, 00000, "Flashback Archive \"%s\" is blocking and tracking on all tables is suspended"
// *Cause: Flashback archive tablespace has run out of space.
// *Action: Add tablespace or increase tablespace quota for the flashback archive.
//
? 55617, 00000, "Flashback Archive \"%s\" runs out of space and tracking on \"%s\" is suspended“
// *Cause: Flashback archive tablespace quota is running out.
// *Action: Add tablespace or increase tablespace quota for the flashback archive.
注:此后,由于FBDA无法归档这些操作,新的事务处理会受到阻止。跟踪数据中不会因丢失的操作而出现间断。提高限额或扩展分配的表空间会导致FBDA先处理未归档的事务处理,然后再处理正在进行的事务处理或新的事务处理。
维护闪回数据归档
1.增加空间:
ALTER FLASHBACK ARCHIVE fla1
ADD TABLESPACE tbs3 QUOTA 5G;
为闪回数据归档FLA1最多增加5 GB 的TBS3表空间(归档管理员不能超过由DBA 授予的表空间限额)。
2.更改保留时间:ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
将闪回数据归档FLA1的保留时间更改为两年。
3.清除数据:
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE
TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' day);
从闪回数据归档FLA1中清除了一天前的所有历史记录数据。通常会在保留时间到期后的第一天执行自动清除。也可以覆盖此设置以进行临时清除。
4.删除闪回数据归档:DROP FLASHBACK ARCHIVE fla1;
删除闪回数据归档FLA1和历史记录数据,但不删除其表空间。使用ALTER FLASHBACK ARCHIVE命令,可以:
- 更改闪回数据归档的保留时间
- 清除部分或全部数据
- 增加、修改和删除表空间
注:删除闪回数据归档的全部表空间会引发错误。
出于某些目的,组织需要存储历史记录数据。闪回数据归档功能可通过“as of”查询提供对历史记录数据的无缝访问。可将闪回数据归档功能用于兼容性报告、审计报表、数据分析和决策支持。
闪回数据归档:示例
1.强制执行数字粉碎:
CREATE FLASHBACK ARCHIVE tax7_archive
TABLESPACE tbs1 RETENTION 7 YEAR;
假设希望建立自己的数据库,以便在7 年后的第一天自动删除TAX7_ARCHIVE中的信息。
2.访问历史记录数据:
SELECT symbol, stock_price FROM stock_data
AS OF TIMESTAMP TO_TIMESTAMP ('2006-12-31 23:59:00',
'YYYY-MM-DD HH24:MI:SS')
要在2006 年12 月31 日营业时间结束时检索股票行情
3.恢复数据:
INSERT INTO employees
SELECT * FROM employees AS OF TIMESTAMP
TO_TIMESTAMP('2007-06-12 11:30:00','YYYY-MM-DD HH24:MI:SS')
WHERE name = 'JOE';
如果发现错误删除了JOE的雇员记录,但该记录在2007 年6 月12 日11:30 时仍然存在,可以重新将其插入
闪回数据归档:
DDL 限制
出于安全性和合法兼容性方面的考虑,上述限制可确保闪回数据归档中的数据不会失效。对启用了闪回数据归档功能的表使用下述任一DDL 语句都会导致错误ORA-55610:
? 执行以下任一操作的ALTER TABLE语句:
– 删除、重命名或修改列
– 执行分区或子分区操作
– 将LONG列转换为LOB列
– 包括UPGRADE TABLE子句(不管有无INCLUDING DATA子句)
? DROP TABLE语句
查看闪回数据归档
可使用动态数据字典视图查看跟踪表和闪回数据归档元数据。要访问USER_FLASHBACK视图,需要拥有表的所有权。对于其它视图,则需要拥有SYSDBA权限。
示例:
? 查询闪回数据归档的创建时间:
SELECT FLASHBACK_ARCHIVE_NAME, CREATE_TIME, STATUS
FROM DBA_FLASHBACK_ARCHIVE;
? 列出闪回数据归档使用的表空间:
SELECT *
FROM DBA_FLASHBACK_ARCHIVE_TS;
? 列出特定表的归档表名称:
SELECT ARCHIVE_TABLE_NAME
FROM USER_FLASHBACK_ARCHIVE_TABLES
WHERE TABLE_NAME = 'EMPLOYEES';
无法从动态性能(V$) 视图中检索过去的数据。对此类视图中的查询总是返回当前数据。不过,您可以在静态数据字典视图(如*_TABLES)中对过去的数据执行查询。
查看结果:
显示有关闪回数据归档的信息 *_FLASHBACK_ARCHIVE
显示闪回数据归档的表空间 *_FLASHBACK_ARCHIVE_TS
显示有关启用了闪回归档的表的信息 *_FLASHBACK_ARCHIVE_TABLES
标准和使用提示
? 为了确保数据库的一致性,应始终在查询过去的数据前执行COMMIT或ROLLBACK操作
? 请记住,所有闪回处理都使用当前的会话设置(如国家语言和字符集),而不使用查询时生效的设置。
? 要获得稍后与闪回功能一起使用的SCN,可以使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数。
? 要计算或检索查询中使用的过去某个时间,请使用函数返回值作为时间戳或SCN 参数。例如,将SYSTIMESTAMP函数的值加上或减去一个INTERVAL值。使用以下公式计算过去的某个时间:(SYSTIMESTAMP - INTERVAL '10' MINUTE)
? 要查询某个精确时间的过去数据,请使用SCN。如果使用时间戳,查询的实际时间可以比指定的时间最多早3 秒。Oracle DB 在内部使用SCN 并将其映射到粒度为3 秒的时间戳。
一、测试环境准备:
1、首先创建一个闪回数据归档的表空间,闪回数据归档由一个或多个表空间(或其中的几部分)组成。
sys@TEST0924> create tablespace fla_tbs1
2 datafile '/u01/app/oracle/oradata/test0924/fla_tbs01.dbf' size 10M
3 reuse autoextend on next 640k maxsize 32767M
4 nologging extent management local segment space management auto
5 /
Tablespace created.
2、再创建一个undo表空间做测试用
sys@TEST0924> create undo tablespace undotbs2
2 datafile '/u01/app/oracle/oradata/test0924/undotbs02.dbf' size 105M
3 reuse autoextend on next 5120k maxsize 32767M
4 /
Tablespace created.
3、创建一个archive_admin用户,来作为归档管理员,默认表空间为fla_tbs1。
sys@TEST0924> create user archive_admin profile default identified by archive_admin
2 default tablespace fla_tbs1
3 account unlock
4 /
User created.
4、授予这个用户相应的权限
sys@TEST0924> grant alter session to archive_admin;
Grant succeeded.
sys@TEST0924> grant create database link to archive_admin;
Grant succeeded.
sys@TEST0924> grant create sequence to archive_admin;
Grant succeeded.
sys@TEST0924> grant create session to archive_admin;
Grant succeeded.
sys@TEST0924> grant create synonym to archive_admin;
Grant succeeded.
sys@TEST0924> grant create view to archive_admin;
Grant succeeded.
sys@TEST0924> grant unlimited tablespace to archive_admin;
Grant succeeded.
sys@TEST0924> grant execute on sys.dbms_stats to archive_admin;
Grant succeeded.
sys@TEST0924> grant connect,resource to archive_admin;
Grant succeeded.
环境搭建完毕。
二、授予archive_admin一些闪回数据归档的权限
授予archive_admin用户管理权限以创建、维护和删除闪回数据归档,以sys用户授予
sys@TEST0924> grant flashback archive administer to archive_admin;
Grant succeeded.
为归档管理员授予FLASHBACK ARCHIVE ADMINISTER系统权限,允许其执行下列语句:
? CREATE FLASHBACK ARCHIVE
? ALTER FLASHBACK ARCHIVE
? DROP FLASHBACK ARCHIVE
三、以archive_admin用户连接数据库
sys@TEST0924> conn archive_admin/archive_admin
Connected.
四、创建闪回数据归档。
archive_admin@TEST0924> create flashback archive fla1 tablespace fla_tbs1 quota 10M retention 1 year
2 /
Flashback archive created.
使用CREATE FLASHBACK ARCHIVE语句创建闪回数据归档。
? 可以为系统指定默认的闪回数据归档(可选)。如果省略此选项,则以后仍可以将此闪回数据归档指定为默认选项。
? 需要提供闪回数据归档的名称。
? 需要提供闪回数据归档的第一个表空间的名称。
? 可以确定表空间中闪回数据归档可以使用的最大空间量。默认设置是不受限制。如果第一个表空间中的空间限额不是无限制的,则必须指定该值,否则会引发ORA-55621。
? 需要提供保留时间(表的闪回数据归档数据的保留天数)。
五、授予HR用户使用fla1归档的权限。
archive_admin@TEST0924> grant flashback archive on fla1 to hr;
Grant succeeded.
要允许特定用户使用特定闪回数据归档,为归档用户授予对该闪回数据归档的FLASHBACK ARCHIVE对象权限。这样,归档用户可以使用特定闪回数据归档对表启用闪回归档。
以归档管理员身份执行以下示例:
GRANT FLASHBACK ARCHIVE ON FLA1 TO HR;
用户很有可能会使用其它闪回功能。要允许在查询期间访问特定对象,授予对查询涉及的所有对象的FLASHBACK和SELECT权限。
如果用户需要访问DBMS_FLASHBACK程序包,则需要为他们授予对此程序包的SELECT权限。这样,用户就可以使DBMS_FLASHBACK.ENABLE和DBMS_FLASHBACK.DISABLE过程来启用或禁用闪回数据归档。
六、切换闪回归档用户角色,即HR用户,将employees表启用闪回数据归档。
archive_admin@TEST0924> conn hr/hr
Connected.
hr@TEST0924> alter table employees flashback archive fla1;
Table altered.
七、查看Feeney先生的薪金并为其加薪三次,每次增加1000.
hr@TEST0924> select employee_id,last_name,salary from employees
2 where last_name='Feeney';
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
197 Feeney 3000
hr@TEST0924>
hr@TEST0924> update employees set salary=salary+1000 where last_name='Feeney';
1 row updated.
hr@TEST0924> commit;
Commit complete.
hr@TEST0924> update employees set salary=salary+1000 where last_name='Feeney';
1 row updated.
hr@TEST0924> commit;
Commit complete.
hr@TEST0924> update employees set salary=salary+1000 where last_name='Feeney';
1 row updated.
hr@TEST0924> commit;
Commit complete.
hr@TEST0924> select employee_id,last_name,salary from employees
2 where last_name='Feeney';
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
197 Feeney 6000
八、查询归档表的内部名称
hr@TEST0924> select * from user_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
---------- ---------- -------------------- ------------------------- -------------
EMPLOYEES HR FLA1 SYS_FBA_HIST_76277 ENABLED
九、确保一下查询使用归档表而不是undo区,故将切换undo表空间并删除旧的表空间。
以sys用户将undotbs2指定为当前表空间。
hr@TEST0924> conn /as sysdba
Connected.
sys@TEST0924> alter system set undo_tablespace=UNDOTBS2;
System altered.
sys@TEST0924> drop tablespace UNDOTBS1;
Tablespace dropped.
十、以hr用户身份,选择在创建闪回数据库归档之后到执行错误DML之前这段时间内的一个时间。
查看'Feeney'先生在该时间的雇员记录,用所选历史日期替换‘10’ minute,示例格式如下:‘50’ SECOND, ‘10’ DAY, ‘5’ MONTH):
注意:如果指定了启动闪回数据归档之前的时间,将出现ORA-1466错误。缩短时间间隔,然后重试。
如果仍然看到薪金为6000,就增加时间间隔再查询。
hr@TEST0924> select employee_id,last_name,salary from employees
2 as of timestamp (systimestamp - interval '20' minute)
3 where last_name='Feeney';
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
197 Feeney 6000
hr@TEST0924> select employee_id,last_name,salary from employees
2 as of timestamp (systimestamp - interval '30' minute)
3 where last_name='Feeney';
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
197 Feeney 3000
十一、作为hr用户,最新的更新是错误的。要还原到所选历史日期的原始值(例如,三十分钟钱)
hr@TEST0924> update employees
2 set salary=(select salary from employees as of timestamp (systimestamp - interval '30' minute) where last_name='Feeney')
3 where last_name='Feeney';
1 row updated.
hr@TEST0924> select salary from employees where last_name='Feeney';
SALARY
----------
3000
hr@TEST0924> commit;
Commit complete.
十二、以sys用户连接数据库,查看可用的数据字典视图:
sys@TEST0924> select table_name from dict where table_name like upper('%flashback_archive%');
TABLE_NAME
------------------------------
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES
查看DBA_FLASHBACK_ARCHIVE
sys@TEST0924> desc DBA_FLASHBACK_ARCHIVE
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
OWNER_NAME VARCHAR2(30)
FLASHBACK_ARCHIVE_NAME NOT NULL VARCHAR2(255)
FLASHBACK_ARCHIVE# NOT NULL NUMBER
RETENTION_IN_DAYS NOT NULL NUMBER
CREATE_TIME TIMESTAMP(9)
LAST_PURGE_TIME TIMESTAMP(9)
STATUS VARCHAR2(7)
sys@TEST0924> select OWNER_NAME,FLASHBACK_ARCHIVE_NAME,CREATE_TIME,STATUS,RETENTION_IN_DAYS from DBA_FLASHBACK_ARCHIVE;
OWNER_NAME FLASHBACK_ARCHIVE_NAME CREATE_TIME STATUS RETENTION_IN_DAYS
--------------- ------------------------- ----------------------------------- ------- -----------------
ARCHIVE_ADMIN FLA1 01-OCT-13 05.09.38.000000000 PM 365
查询DBA_FLASHBACK_ARCHIVE_TS
sys@TEST0924> desc DBA_FLASHBACK_ARCHIVE_TS
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
FLASHBACK_ARCHIVE_NAME NOT NULL VARCHAR2(255)
FLASHBACK_ARCHIVE# NOT NULL NUMBER
TABLESPACE_NAME NOT NULL VARCHAR2(30)
QUOTA_IN_MB VARCHAR2(40)
sys@TEST0924> select * from DBA_FLASHBACK_ARCHIVE_TS;
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
------------------------- ------------------ ------------------------------ ---------------
FLA1 1 FLA_TBS1 10
查询DBA_FLASHBACK_ARCHIVE_TABLES
sys@TEST0924> desc DBA_FLASHBACK_ARCHIVE_TABLES
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
TABLE_NAME NOT NULL VARCHAR2(30)
OWNER_NAME NOT NULL VARCHAR2(30)
FLASHBACK_ARCHIVE_NAME NOT NULL VARCHAR2(255)
ARCHIVE_TABLE_NAME VARCHAR2(53)
STATUS VARCHAR2(13)
sys@TEST0924> select * from DBA_FLASHBACK_ARCHIVE_TABLES;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
------------------------------ --------------- ------------------------- -------------------- -------------
EMPLOYEES HR FLA1 SYS_FBA_HIST_76277 ENABLED
以用户的身份来查询,同sys_*一样
hr@TEST0924> select table_name from dict where table_name like '%FLASHBACK_ARCHIVE%';
TABLE_NAME
------------------------------
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES
十三、闪回数据归档维护
以archive_admin用户来实验
hr@TEST0924> conn archive_admin/archive_admin
Connected.
archive_admin@TEST0924>
1、超过保留时间,将自动清除闪回数据归档中的数据。也可以使用以下命令来显示清除数据。
清除两分钟以前的数据:
archive_admin@TEST0924> alter flashback archive fla1 purge before timestamp(systimestamp - interval '2' minute);
Flashback archive altered.
2、添加另一个表孔家用于增加闪回数据归档空间
archive_admin@TEST0924> conn /as sysdba
Connected.
sys@TEST0924> create tablespace fla_tbs2
2 datafile '/u01/app/oracle/oradata/test0924/fla_tbs02.dbf'
3 size 10M reuse autoextend on next 640K maxsize 32767M
4 nologging extent management local segment space management auto
5 /
Tablespace created.
3、作为archive_admin用户,将5MB的fla_tbs2表空间添加到fla1闪回数据归档。
sys@TEST0924> conn archive_admin/archive_admin
Connected.
archive_admin@TEST0924> alter flashback archive fla1 add tablespace fla_tbs2 quota 5M;
Flashback archive altered.
4、一个特定闪回数据归档中的所有表都具有相同的保留时间。
将fla1闪回数据归档的保留时间更改为2年。
archive_admin@TEST0924> alter flashback archive fla1 modify retention 2 year;
Flashback archive altered.
 
十四、以 ARCHIVE_ADMIN 用户身份,删除 FLA1 闪回数据归档。
注:删除闪回数据归档也会删除内部防篡改历史记录表。由于审计和安全的要求,无法直接删除此表。由于表空间可能包含其它数据,因此删除闪回数据归档不会删除它所在的表空间。
archive_admin@TEST0924> DROP FLASHBACK ARCHIVE fla1;
Flashback archive dropped.











About Me

.............................................................................................................................................

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客园地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ群号:230161599(满)、618766405

● 微信群:可加我微信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友646634621,注明添加缘由

● 于 2017-04-01 09:00 ~ 2017-04-31 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

.............................................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。

   小麦苗的微信公众号      小麦苗的DBA宝典QQ群1     小麦苗的DBA宝典QQ群2        小麦苗的微店

.............................................................................................................................................


DBA笔试面试讲解群1
DBA笔试面试讲解群2
欢迎与我联系



阅读(6107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册

/bbsy/461q.html /55901/053c.html /boss/602D.html /8888/882a.html /123/668T.html /bbs/400h.html /wb/865q.html /bbsy/632d.html /0088/510n.html /pmw/418O.html /bosoo/556P.html /ggs/308P.html /888/124r.html /xyw/635O.html /gpw/100M.html /boss/386M.html /0088/526V.html /ggs/236K.html /gpw/235h.html /bg88/718z.html /pmw/004b.html /gupiao/146m.html /55901/350H.html /ks/783T.html /boss/658C.html /88410/068S.html /gpw/588Q.html /ymw/312y.html