oracle--23闪回操作

1、Flashback Database(利用闪回日志恢复)

 Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,如Word中的"撤消"操作,可以不利用备份就快速的实现基于时间点的恢复。Oracle通过创建新的Flashback Logs(闪回日志),记录数据库的闪回操作。如果希望能闪回数据库,需要设置如下参数:DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢复区的大小。在创建数据库的时候,Oracle将自动创建恢复区,但默认是关闭的,需要执行alter database flashback on命令。

 

例:执行Flashback Database命令格式。

SQL>flashback database to time to_timestamp(xxx);

SQL>flashback database to scn xxx

 

2、Flashback Table(利用UNDO保留信息恢复)

 Oracle Flashback Table特性允许利用Flashback Table语句,确保闪回到表的前一个时间点。与Oracle 9i中的Flashback Query相似,利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照)。要注意的是,Flashback Table不等于Flashback Query,Flashback Query仅仅是查询以前的一个快照点而已,并不改变当前表的状态,而Flashback Table将改变当前表及附属对象一起回到以前的时间点。

 语法:

 flashback table tablename to timestamp xxx或

 flashback table tablename to scn xxx

 

注意:如果需要闪回一个表,需要以下条件:

 需要有flashback any table的系统权限或者是该表的flashback对象权限;

 需要有该表的select,insert,delete,alter权限;

 必须保证该表row movement。

 

例:执行将test表闪回到2011年5月7日下午3点。

SQL>flashback table test to timestamp to_timestamp(’2011-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);

 

3、Flashback Drop(利用回收站功能恢复)

注:由于目前的环境为了实现OGG的DDL同步,关闭了回收站功能,故这个功能不可用。

 

4、Flash Version Query(利用UNDO保留信息恢复)

 Oracle Flashback Version Query特性,利用保存的回滚信息,可以看到特定的表在时间段内的任何修改,如电影的回放一样,可以了解表在该期间的任何变化。Flashback version query一样依赖于AUM,提供了一个查看行改变的功能,能找到所有已经提交了的行的记录,分析出过去时间都执行了什么操作。Flashback version query采用VERSIONS BETWEEN语句来进行查询,常用的方法:

 

  ·VERSIONS_SCN - 系统改变号

 

  ·VERSIONS_TIMESTAMP - 时间

 

  例如:在test表中,时间1插入一条记录,时间2删除了这条记录,对于时间3执行select * from test当然查询不到这条记录,只能看到该表最后的提交记录。这时如果利用Flash Table或者是Flash Query,只能看到过去的某一时间点的一个快照,而利用Flashback Version Query,能够把时间1、时间2的操作给记录下来,并详细的查询出对表进行的任何操作。

 

基于SCN的闪回查询:

SQL> select count(*) from lm_mtrp_syn_channelinfo as of scn 708000000;

 

  COUNT(*)

----------

        21

 

基于时间段的闪回查询:

SQL>select versions_starttime,versions_endtime, versions_xid,versions_operation,id

from test versions

between timestamp minvalue and maxvalue

order by versions_starttime;

 

5,Flashback Transaction Query(利用UNDO保留信息恢复)

 Oracle Flashback Transaction Query特性确保检查数据库的任何改变在一个事务级别,可以利用此功能进行诊断问题、性能分析和审计事务。它其实是Flashback Version Query查询的一个扩充,Flashback Version Query说明了可以审计一段时间内表的所有改变,但是也仅仅是能发现问题,对于错误的事务,没有好的处理办法。而Flashback Transaction Query提供了从FLASHBACK_TRANSACTION_QUERY视图中获得事务的历史以及Undo_sql(回滚事务对应的sql语句),也就是说审计一个事务到底做了什么,甚至可以回滚一个已经提交的事务。

 例:Flashback Transaction Query的操作实例。

 (1)在test表中删除记录,获得事务的标识XID,然后提交。

 SQL>delete from test where id=2;

 SQL>select xid from v$transaction;

 XID

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

 04001200AE010000

 SQL>commit;

 

  在测试中方便起见,在事务没有提交的时候,获得事务的XID为04001F0035000000。实际情况下,不可能去跟踪每个事务,想要获得已提交事务的XID,就必须通过上面的Flashback Version Query。

 

  (2)进行Flashback Transaction Query

 

SQL>select * from FLASHBACK_TRANSACTION_QUERY

 where xid=’04001F0035000000’;

 UNDO_SQL

 insert into "FLASHTEST"."TEST"("ID") values (’2’);

 

注意:这个删除语句对应的是1个Insert语句,如果想回滚这个事务,执行这个Insert语句即可。

 可以看到,Flashback Transaction Query主要用于审计一个事务,并可以回滚一个已经提交的事务。如果确定出错的事务是最后一个事务,我们利用Flashback Table或者Flashback Query就可以解决问题。但是,如果执行了一个错误的事务之后,又执行了一系列正确的事务,那么上面的方法就无能为力,利用Flashback Transaction Query可以查看或回滚这个错误的事务。

 

另:ORACLE 11G还多了一个闪回数据归档的功能,即可将UNDO的信息进行归档,这个功能对于一些比较重要的表,可以起到一个长期的历史数据追溯作用,是对UNDO的过期信息一个革命性的改进,当然,启用这种功能,也消耗一定的存储空间和性能。


Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复。闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行、事务、表和数据库范围。使用闪回特性,您可以查询以前的数据版本,还可以执行更改分析和自助式修复,以便在保持数据库联机的同时从逻辑损坏中恢复。
闪回技术包括以下特性:
   (1)闪回查询允许用户查询过去某个时间点的数据,以重新构建由于意外删除或更改而丢失的数据。
   (2)闪回版本查询提供了一种查看行级数据库随时间变化的方法。
   (3)闪回事务查询提供了一种查看事务级数据库变化的方法。
   (4)闪回数据库是进行时间点恢复的新策略。它能够快速将Oracle 数据库恢复到以前的时间,正确更正由于逻辑数据损坏或用户错误而引起的任何问题。
   (5)闪回表功能使 DBA 可以非常快速、轻松地将一个表或一组表恢复至过去特定的某一时间点。
   (6)闪回删除在删除对象时提供了一个安全网,您可以非常快速、轻松地取消对一个表及其相关对象对象的删除。
  
  Flashback技术是以Undo Segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。闪回参数如下:
  Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0
  Connected as system@LOCAL_DB
  SQL> show parameter undo_
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  undo_management                      string      AUTO
  undo_retention                        integer     900    --默认是1440 即24*60,只保留一天的闪回数据,具体值在安装数据库实例时可以设置
  undo_tablespace                        string      UNDOTBS1
  
  
接下来讲讲oracle数据库闪回类型主要有三种:
  (1)闪回数据库(flashback database)
  闪回数据库就是当出现逻辑错误时,能够将整个数据库回退到出错前的那个状态。
  (2)闪回删除(flashback drop)
  Oracle10g之前,一旦删除了一个表,那么该表就会从数据字典里面删除。要恢复该表,需要进行不完全恢复。
  Oracle10g以后,当我们删除表时,默认Oracle只是在数据库字典里面对被删的表的进行了重命名,并没有真正的把表删除。
  (3)闪回表(flashback table)
  
  所谓闪回表,就是将表里的数据会退到历史上的某个时间点,例如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个过程中,数据库仍然可用,而且不需要类似于闪回日志一样的额外空间。闪回表利用的是undo表空间里记录的数据被改变前的值,如果闪回表所需要的undo数据,由于保留的时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据块被其他事务覆盖,就不能恢复到指定的时间点了。
  一、闪回数据库详解
  Flashback Database整个架构包括一个进程Recover Writer(RVWR)后台进程、Flashback Database Log日志和Flash Recovery Area。闪回数据库的实现机理是闪回日志,只要配置了闪回数据库,就会自动创建闪回日志。只要数据库里的数据发生变化,oracle会将数据修改前的旧值保存在闪回日志中。
  数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。
  (1)数据库配置为归档模式
  SQL> select log_mode from v$database;
    LOG_MODE
    ------------
    NOARCHIVELOG
  SQL> archive log list;
    数据库日志模式             非存档模式
    自动存档             禁用
    存档终点            USE_DB_RECOVERY_FILE_DEST
    最早的联机日志序列     320
    当前日志序列           322
 1、启动归档为归档模式(其与将非归档模式转为归档模式步骤相似):
  (1)保存一致性,先关闭数据库
   shutdown immediate ;
  (2)启动到mount阶段
   startup mount;
  (3)启动闪回功能
   alter database flashback on; --alter database archivelog;将数据库改为规定模式
  (4)切换到open阶段
   alter database open;
  (5)对数据做一个完整备份
   full backup --可以使用数据泵(expdp)或者使用RMAN
  
  启动闪回功能完善。
 2、配置闪回恢复区(flash recovery area FRA)
  SQL> show parameter db_recovery_file
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  db_recovery_file_dest                string      D:\app\flash_recovery_area
  db_recovery_file_dest_size           big integer 2G
   一般在安装数据库实例时,会让你选择是否开启oracle数据闪回功能,默认是开启的,安装过程中可以配置闪回路径以及闪回空间的大小。
 3、配置闪回保留时间
  SQL> show parameter db_flashback_retention_target
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_flashback_retention_target        integer     1440
    db_flashback_retention_target参数用来控制flashback log 数据保留的时间,默认值是1440,单位是minute,即24小时。
  4、启动数据库实例即可
  5、获取当前时间点和SCN
    SQL> select dbms_flashback.get_system_change_number from dual;
 
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                    13081009
 
    SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt from dual;
 
    SYSDT
    -------------------
    2013-08-25 21:12:46
 
    SQL> truncate table dept;
    Table truncated
  Flashback Database 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。
  
  SQL> shutdown immediate;
    数据库已经关闭。
   已经卸载数据库。
   ORACLE 例程已经关闭。
  SQL> startup mount;
  ORACLE 例程已经启动。
  Total System Global Area 1071333376 bytes
  Fixed Size                  1348508 bytes
  Variable Size             385879140 bytes
  Database Buffers          679477248
  bytes Redo Buffers                4628480 bytes
  数据库装载完毕。
  SQL> flashback database to timestamp to_timestamp('2013-08-25 21:12:46','yyyy-mm-dd HH24:MI:SS');
闪回完成。
 或者使用 SQL> flashback database to scn 13081009;
 在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
  1)直接alter database open resetlogs打开数据库,当然,指定scn或者timestamp时间点之后产生的数据统统丢失。
  2)先执行alter database open read only命令以read-only模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
  SQL>alter database open read only;
  
查询被truncate的表,是否已经闪回数据。
  SQL> select deptno from dept;
  deptno
  ----------------------------------------
  0105206000001
  0105108040001
  0105304000001
  0105304010001
  010560001
  0105600010001
  0105601000001
  0105602000001
  证明闪回成功。
二、闪回删除
  Oracle10g以后,当我们删除表时,默认Oracle只是在数据库字典里面对被删的表的进行了重命名,并没有真正的把表删除。
  回收站(recyclebin):用来维护表被删除前的名字与删除后系统生成的名字之间的对应关系的数据字典,表上的相关对象(索引、触发器等)也会一并进入回收站。
  SQL> show parameter recycle
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  buffer_pool_recycle                  string     
  db_recycle_cache_size                big integer 0
  recyclebin                                                  on
实例一:闪回sys用户下的表
SQL> select * from user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
SQL> drop table dept;
Table dropped
SQL> select * from user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
SQL>flashback table dept to before drop; --或者使用(flashback table dept to before drop rename to dept_bak;)
报如下错误:ORA-38305: 对象不在回收站中
原因:Flashback不支持sys用户与system表空间下的对象,也不能从回收站里拿到。故使用SYS或者SYSTEM用户登陆时,show recyclebin为空。
实例二:闪回非sys、system用户下的表
 SQL> drop table DEPT_BAK;
Table dropped
SQL> select * from user_recyclebin a where a.original_name = 'DEPT_BAK';
OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
BIN$BnpnsFC8SfSYdJ7Qio0k2g==$0 DEPT_BAK                        DROP      TABLE                     TESTSPACE                      2013-04-21:15:38:04 2013-08-25:22:11:45   13087074                                  YES        YES           745783      745783       745783          8
SQL> flashback table DEPT_BAK to before drop;
Done
备注:
1、 禁用与启用recyclebin该功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
禁用后删除的对象将直接删除,不会写到Recyclebin中,当然在删除时,指定purge参数,表也将直接删除,不会写到recyclebin中。
SQL> drop table name purge;
2)关于purge命令
  表空间的RecycleBin区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此RecycleBin是和普通对象共用表空间的存储区域,或者说是RecycleBin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖RecycleBin中的对象。也可以手动的删除Recycle Bin占用的空间。
  1)Purge tablespace tablespace_name;  用于清空表空间的RecycleBin
  2)Purge tablespace tablespace_name user user_name;  清空指定表空间的Recycle Bin中指定用户的对象
  3)Purge recyclebin;  删除当前用户的Recycle Bin中的对象
  4)Purge dba_recyclebin  删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
  5)Drop table table_name purge;  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
  6)Purge index recycle_bin_object_name;  当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。因为索引是可以重建的。
三、闪回表
  查询过去某个时刻表的数据的情况,一旦确认某个时刻的数据满足我们的需求以后,可以根据这个时间执行闪回表。
  ORA-08189: 因为未启用行移动功能, 不能闪回表,需要先执行一个命令:ALTER TABLE dept ENABLE ROW MOVEMENT。
 语法一:
   select * from dept
   VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '1' DAY AND SYSTIMESTAMP -INTERVAL '1' HOUR;
 
 语法二:
   select * from dept as of timestamp to_timestamp('2013-08-25 21:12:46','yyyy-mm-dd HH24:MI:SS');
 
 语法三:
   select * from dept as of scn 13081009;
 
 语法四:
   select * from flashback_transaction_query a where a.table_name='DEPT';

附注:interval用法
Oracle语法:
INTERVAL '{ integer | integer time_expr | time_expr }' { { DAY | HOUR | MINUTE } [ ( leading_precision ) ] | SECOND [ ( leading_precision
[, fractional_seconds_precision ] ) ] } [ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]
leading_precision值的范围是0到9, 默认是2. time_expr的格式为:HH[:MI[:SS[.n]]] or MI[:SS[.n]] or SS[.n], n表示微秒.
该类型与INTERVAL YEAR TO MONTH有很多相似的地方,建议先看INTERVAL YEAR TO MONTH再看该文.
INTERVAL '20' DAY - INTERVAL '240' HOUR = INTERVAL '10-0' DAY TO SECOND
表示: 20天 - 240小时 = 10天0秒
INTERVAL '30.12345' SECOND(2,4)   
表示: 30.1235秒, 因为该地方秒的后面精度设置为4, 要进行四舍五入.
查询tableA中10分钟前的数据(闪回查询,前提:undo没有被覆盖..如果undo被覆盖,查询会失败)
Select * From table dept As Of Timestamp (systimestamp - Interval '10' minute);

使用带有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时表中的内容,来找到丢失的数据。如果需要,可以还原数据。

-- 使用闪回查询获取丢失的行
SELECT * FROM employees
AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'Chung';
 
--使用闪回查询还原丢失的行
INSERT INTO employees (
  SELECT * FROM employees
  AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
  WHERE last_name = 'Chung'
);

Oracle闪回查询指导
1. 可以对每个表指定或省略AS OF子句,对不同的表指定不同的次数。
注意:如果一个表是闪回数据归档,并且指定了时间比它创建的时间还要早,则查询会返回0行,而不会引起错误。
2. 可以在查询中使用AS OF子句来执行DDL操作(例如创建和截断表),
也可以用来在和闪回查询相同的会话中执行DML操作(INSERT、DELETE)。
3. 在影响数据库当前状态的DDL语句或DML语句中使用闪回查询的结果,
可以在INSERT或CREATE TABLE AS SELECT语句中使用AS OF子句。
4. 如果在应用中,这种3秒钟的误差对于闪回查询是重要的,则使用SCN而不是时间戳。
5. 可以使用创建视图引用过的数据,即在视图定义的SELECT语句中使用AS OF子句。
如果指定一个相对时间,即从数据库主机的当前时间减去,则对于每个查询,时间要重新计算。
CREATE VIEW hour_ago AS
  SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
6. 可以在自连接或集合操作中使用AS OF子句,来提取和比较来自于不同时间的数据。
可以通过在闪回查询之前加上CREATE TABLE AS SELECT或INSERT INTO TABLE SELECT,来存储闪回查询的结果。
INSERT INTO employees
(SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE))
MINUS
SELECT * FROM employees;

 
闪回作用
自动的基于磁盘的备份与恢复,能把表恢复到过去的某个时间点
 
查看闪回区
Show parameter db_recovery_file_dest  查看闪回区详细信息
Select  flashback_on from v$database  查看闪回区是否开启
 
2,修改闪回功能
SQL> startup mount    数据库启动到mount下
SQL> alter database flashback on (off);  开启关闭闪回区
注:如遇到38706事件错误,可能是因为归档不正确。先启用归档
SQL>alter database archivelog
SQL> alter system set db_flashback_retention_target=2880 修改闪回时间,默认是1440  闪回时间是指数据库能回退的时间
 
闪回使用实例:(注:sys用户下不可用闪回)
1,闪回drop的表
在非sys用户下创建表和表上索引,插入相关数据
create table abc (f number(9));
create index idx_test on abc(f);
insert into abc values(1);
insert into abc values(2);
insert into abc values(3);
 
删除表
drop table abc;
 
删除表之后,表并没有被真正删除,而是重命名之后放在同一用户下的回收站内,同时表上的索引等也会被如此处理。回收站满后以先进先出的原则管理
查看表语句 select * from tab;
查看索引语句 select index_name, index_type, table_name from ind;
查看回收站语句 show recyclebin
清空回收站语句 PURGE RECYCLEBIN;
注:没有放入回收站的表不能被闪回
 
闪回之后,即可再次看到表
flashback table abc to before drop;
但是表闪回后相应的索引等需要重新编译
 
2,闪回DML语句
Flashback table abc to timestamp to_timestamp(‘2014-02-14 16:00:00’,’yyyy-mm-dd hh24:mi:ss’)
闪回可能会遇到08189错误,执行下列语句
alter table testvarchar enable row movement;
 
意思是允许Oracle修改rowid。Oracle插入数据时会为该条数据分配唯一rowid并且不变,要启用闪回功能必须开启可修改rowid功能
闪回DML数据是使用回滚段进行恢复
 
附:查询所有可以撤消的操作,该操作依赖于undo_retention
SELECT versions_xid as xid,
       versions_startscn,
       versions_endscn,
       versions_operation 
FROM scott.abc VERSIONS between scn minvalue and maxvalue
 
 
查询undo_retention参数
该参数保存了回滚段数据保存的秒时间,超过该时间则无法闪回。默认为15分钟
修改该参数 alter system set undo_retention=3600;

一、打开闪回数据库特性:
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;

1,闪回数据库到之前某时间点(在安装时需要开放闪回功能)
不支持表空间删除
 select name from v$database;
 --看是否打开闪回功能
 select flashback_on,name from v$database;
 select name from v$bgprocess where paddr<>'00' order by 1;

打开闪回功能
SQL> shutdown immediat
SQL> startup mount
SQL> alter database flashback on;
SQL> alter database open;
修改闪回时间(默认是一天1440)
SQL> alter system set db_flashback_retention_target=2880
RMAN> backup recovery files;--执行此程序,必须要有磁带
执行数据库闪回,必须是在mount,readonly状态
如果重建了控制文件,则修改控制文件以前的数据是不可以闪回的。
例子;
create table t2( a int);
insert into t2 values(1);
insert into t2 values(2);
insert into t2 values(5);
alter system switch logfile;
t2 10:35
insert into t2 values(100);
alter system switch logfile;
insert into t2 values(200);
闪回到某时间点
FLASHBACK DATABASE TO TIME = TO_DATE('2004-05-27 16:00:00','YYYY-MM-DD HH24:MI:SS');
FLASHBACK DATABASE   2  TO TIMESTAMP(SYSDATE-1/24);
查日志进程
select * from v$log;
恢复到某过程sequence为查询的sequence,THREAD
把状态置为mount状态
flashback database to sequence=58 thread=1;
打开数据库
alter database open resetlogs;
 
2,闪回drop表,数据(普通用户都可以操作)
原理:是把放到数据库回收站的对象,数据拉回来
凡不放回收站的对象都不能闪回.
SQL>create table t1(a int);
SQL>drop table t1;
闪回后,把删除的表,及索引都会恢复
SQL>flashback table t1 to before drop;
语法:FLASHBACK TABLE <table_name> TO BEFORE DROP [RENAME TO <new_name>]
可以用下面的命令或查询查看删除的表;
show recyclebin;
select * from recyclebin --where ORIGINAL_NAME='T1';
DBA的回收站
SELECT owner, original_name, object_name,
        type, ts_name, droptime, related, space
FROM dba_recyclebin
WHERE can_undrop = 'YES';
用户回收站
SELECT original_name, object_name,       
       type, ts_name, droptime, related, space
FROM user_recyclebin
WHERE can_undrop = 'YES';
表实际不没有删除,只是改了一个名子,放到回收站了
索引名子依然没变。
a,用SYS用户删除的表不可以闪回。

conn / as sysdba
alter table cbsd.t1 move tablespace system;
drop table cbsd.t1;
则不可以闪回
b.索引,物化视图,删除后不可以闪回
3.闪回事务查询
alter table t1 enable row movement;
查询所有可以撤消的操作
SELECT versions_xid as xid,
       versions_startscn,
       versions_endscn,
       versions_operation 
FROM t1 VERSIONS between scn minvalue and maxvalue
WHERE a = 20;
撤消数据
update 3-->5 undo data
数据放在undo tablespace
sql>show parameter undo;
sql>select file_name from dba_data_files where tablespace_name='UNDOTBS1';
闪回数据:RVWR+闪回日志+归档日志
闪回现有表:undo tablespace
闪回删除表:表原来物理位置

回(Flashback)
SQL> /*
SQL> 错误操作:
SQL> 1. 错误的delete一条记录,并且commit
SQL> 2. 错误地删除了一个表: drop table
SQL> 3. 查询某个表的历史记录(所有已经提交了的历史记录)
SQL> 4. 错误地执行了一个事务
SQL>
SQL> 对应闪回的四种类型:
SQL> 1. 闪回表
SQL> 2. 闪回删除
SQL> 3. 闪回版本查询
SQL> 4. 闪回事务查询
SQL> 5. 闪回数据库
SQL> */
SQL> host cls
SQL> --闪回的时间参数
SQL> conn / as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> show parameters undo;
l闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。
l
l用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
NAME TYPE VALUE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> -- 将900秒改为20分钟
SQL> alter system set undo_retention=1200 scope=both;
系统已更改。
SQL> show parameters undo;
NAME TYPE VALUE
undo_management string AUTO
undo_retention integer 1200
undo_tablespace string UNDOTBS1
SQL> /*
SQL> scope的取值: session spfile(参数文件) both
SQL> */
SQL> --为scott授予闪回的权限
SQL> grant flashback any table to scott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> show user
USER 为 "SCOTT"
SQL> host cls
SQL> --第一种类型闪回:闪回表
SQL> create table flashback_table1
2 (fid number,fnamevarchar2(10));
表已创建。
SQL> insert into flashback_table1 values(&fid,&#39;&fname&#39;);
输入 fid 的值: 1
输入 fname 的值: Tom
SQL> commit;
提交完成。
SQL> select * from flashback_table1;
FID FNAME
1 Tom
2 Mary
3 Mike
SQL> --记录当前的系统时间(SCN)
SQL> select sysdate 时间, timestamp_to_scn(sysdate) SCN fromdual;
时间 SCN
21-9月 -11 4354761
SQL> delete from flashback_table1 wherefid=2;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from flashback_table1;
FID FNAME
---------- ----------
1 Tom
3 Mike
SQL> --执行闪回表
SQL> flashback table flashback_table1 toscn 4354761;
flashback table flashback_table1 to scn4354761
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> select rowid,fid,fname fromflashback_table1;
ROWID FID FNAME
------------------ ---------- ----------
AAANh7AAEAAAAGnAAA 1 Tom
AAANh7AAEAAAAGnAAC 3 Mike
SQL> --开启行移动功能
SQL> alter table flashback_table1 enable row movement;
表已更改。
SQL> flashback table flashback_table1 to scn 4354761;
闪回完成。
SQL> select rowid,fid,fname fromflashback_table1;
ROWID FID FNAME
------------------ --------------------
AAANh7AAEAAAAGnAAB 1 Tom
AAANh7AAEAAAAGnAAD 2 Mary
AAANh7AAEAAAAGnAAE 3 Mike
闪回表语法:
FLASHBACK TABLE [schema.]<table_name>
TO
{[BEFORE DROP [RENAME TO table]]
[SCN|TIMESTAMP]expr
[ENABLE|DISABLE]TRIGGERS}
lschema:模式名,一般为用户名。
lTO TIMESTAMP:系统邮戳,包含年、月、日、时、分、秒。
lTO SCN:系统更改号,
lENABLE TRIGGERS:表示触发器恢复以后为enable状态,而默认为disable状态。
lTO BEFORE DROP:表示恢复到删除之前。
lRENAME TO table:表示更换表名。
SQL> --闪回表的思想:将表回退到过去的一个时间上
SQL> --问题:不知道过去时间,怎么办?
SQL> host cls
SQL> --闪回删除
SQL> --Oracle的回收站
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
FLASHBACK_TABLE TABLE
FLASHBACK_TABLE1 TABLE
SYS_TEMP_FBT TABLE
已选择7行。
删除表。
drop table FLASHBACK_TABLE;
查看回收站
show recyclebin;
清空回收站
purge recyclebin;
彻底删除
drop table FLASHBACK_TABLE1 purge;
回收站只对普通用户有效
删除表
drop table test123;
show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
TEST123 BIN$w6NYaQ1jSZ6uzO2jUQ/ALw==$0 TABLE 2011-09-21:10:35:32
SQL> --闪回删除:从回收站中取回表
SQL> flashback table test123 to before drop;
闪回完成。
SQL> --通过回收站中的名称闪回删除
SQL> flashback table"BIN$9JMrb6kbRCON287lDV+5dA==$0" to before drop;
闪回完成。
SQL> host cls
闪回删除:回收站(recyclebin)简介
l回收站是所有被删除对象及其相依对象的逻辑存储容器,例如当一个表被删除(drop)时,该表及其相依对象并不会马上被数据库彻底删除,而是被保存到回收站中。
l
l回收站将用户执行的drop操作记录在一个系统表中,也就是将被删除的对象写到一个数据字典中。如果确定不再需要该对象,可以使用purge命令对回收站进行清空。
l
l被删除的对象的名字可能是相同的,例如用户创建了一个test表,使用drop命令删除该表后,又创建了一个test表,这时,如果再次删除该表就会导致向回收站中添加了两个相同的表。
l
回收站中对象的命名规则
l为了确保添加到回收站中的对象的名称都是唯一的,系统会对这些保存到回收站中的对象进行重命名,重命名的格式如下:
l
BIN$globalUID$version
l
&bull;其中: BIN表示RECYCLEBIN;globalUID是一个全局唯一的、24个字节长的对象,该标识与原对象名没有任何关系;version指数据库分配的版本号。
SQL> -- 闪回重名的表
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
TEST123 TABLE
SYS_TEMP_FBT TABLE
已选择6行。
SQL> drop table TEST123;
表已删除。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
BIN$eqIO0J1LQ0G1rYAnIHWrdg==$0 TABLE
SYS_TEMP_FBT TABLE
已选择6行。
SQL> create table test123(tid number);
表已创建。
SQL> insert into test123 values(1);
已创建 1 行。
SQL> insert into test123 values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> drop table test123;
表已删除。
SQL> --查询回收站:应该有两个重名的test123
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------------------------------------- ------------
TEST123 BIN$HDhYGEaXTayAnETFAUoaNw==$0 TABLE 2011-09-21:10:41:59
TEST123 BIN$eqIO0J1LQ0G1rYAnIHWrdg==$0 TABLE 2011-09-21:10:41:17
SQL> --闪回这两个表
SQL> flashback table test123 to beforedrop;
闪回完成。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------------------------------------- ------------
TEST123 BIN$eqIO0J1LQ0G1rYAnIHWrdg==$0 TABLE 2011-09-21:10:41:17
SQL> --闪回同名的表,先闪回最后删除那个
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
BIN$eqIO0J1LQ0G1rYAnIHWrdg==$0 TABLE
SYS_TEMP_FBT TABLE
TEST123 TABLE
已选择7行。
SQL> flashback table test123 to beforedrop;
flashback table test123 to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> --重命名
SQL> flashback table test123 to beforedrop rename to test1234;
闪回完成。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
TEST1234 TABLE
SYS_TEMP_FBT TABLE
TEST123 TABLE
已选择7行。
SQL> select * from test123;
TID
----------
1
2
SQL> select * from test1234;
TID TNAME
---------- --------------------
1 Tom
SQL> host cls
闪回 删除: 需要考虑的事情
l闪回删除对下列表无效:
在SYSTEM 表空间内的表
用精细审计的数据库或 虚拟的私人数据库
属于字典管理的表空间
由于空间不足已经被手动或自动删除的表
l以下依赖不被保护:
位图索引
表之前删掉的索引
lFLASHBACK TABLE命令作为单一的事务执行,会得到一个单一的DML锁
表的统计数据不会被闪回
当前的索引和从属的对象会被维持
l闪回表操作:
系统表不能被闪回
不能跨越DDL操作
会被写入警告日志
产生撤销和重做的数据
SQL> --闪回版本查询
SQL> creat table versions_table
SP2-0734: 未知的命令开头 "creat tabl..."- 忽略了剩余的行。
SQL> create table versions_table
2 (vid number,
3 vname varchar(20));
表已创建。
SQL> insert into versions_tablevalues(1,&#39;Tom&#39;);
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into versions_tablevalues(2,&#39;Mary&#39;);
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into versions_tablevalues(3,&#39;Mike&#39;);
已创建 1 行。
SQL> commit;
提交完成。
SQL> update versions_table setvname=&#39;Mary123&#39; where vid=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from versions_table;
VID VNAME
1 Tom
2 Mary123
3 Mike
SQL> /*
SQL> 问题:1
SQL> 1. 如何获取前面三个版本?
SQL> 2. 如何获取该表过去的一个时间?
SQL> */
闪回版本查询
闪回版本查询,提供了一个审计行改变的查询功能,通过它可以查找到所有已经提交了的行记录。其语法格式如下:
selectcolumn_name[,column_name,...]
from table_name
versionsbetween [SCN|TIMESTAMP] [expr|MINVALUE]
and [epxr|MAXVALUE] as of [SCN|TIMESTAMP]expr;
备注:
其中:column_name列名;table_name表名;between...and时间段;SCN系统改变号;TIMESTAMP时间戳;ASOF表示恢复单个版本;MAXVALUE最大值;MINVALUE最小值;expr指定一个值或者表达式。
SQL> --执行闪回版本查询,获取所有的版本信息
SQL> selectvid,vname,versions_operation,versions_starttime,versions_endtime
2 from versions_table
3 versions between timestampminvalue and maxvalue
4 order by 1,4;
SQL> col VERSIONS_STARTTIME for a20
SQL> col VERSIONS_ENDTIME for a20
SQL> /
SQL> col vname for a8
SQL> /
SQL> col VERSIONS_STARTTIME for a30
SQL> col VERSIONS_ENDTIME for a30
SQL> /
SQL> set linesize 150
SQL> /
VID VNAME VVERSIONS_STARTTIME VERSIONS_ENDTIME
---------- -------- - ------------------------------
1Tom I 21-9月 -11 11.01.09 上午
2Mary I 21-9月 -11 11.01.24 上午 21-9月 -11 11.02.00 上午
2Mary123 U 21-9月 -11 11.02.00 上午
3Mike I 21-9月 -11 11.01.39 上午
SQL> /*
SQL> selectvid,vname,versions_operation,versions_starttime,versions_endtime
SQL> from versions_table
SQL> versions between timestamp minvalueand maxvalue
SQL> order by 1,4;
SQL> */
SQL> --通过闪回版本查询,可以获取某个表过去已经提交了的历史版本信息
SQL> host cls
SQL> --闪回事务查询
SQL> create table transaction_table
2 (tid number,tnamevarchar(20));
表已创建。
SQL> --第一个事务
SQL> insert into transaction_tablevalues(1,&#39;Tom&#39;);
已创建 1 行。
SQL> insert into transaction_table values(2,&#39;Mary&#39;);
已创建 1 行。
SQL> insert into transaction_tablevalues(3,&#39;Mike&#39;);
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第二个事务
SQL> update transaction_table settname=&#39;Mary123&#39; where tid=2;
已更新 1 行。
SQL> delete from transaction_table wheretid=3;
已删除 1 行。
SQL> commit;
提交完成。
l闪回事务查询实际上闪回版本查询的一个扩充,通过它可以审计某个事务甚至撤销一个已经提交的事务。
l实现闪回事务查询,需要先了解flashback_transaction_query视图,从该视图中可以获取事务的历史操作记录以及撤销语句(UNDO_SQL)。
l使用闪回事务查询,可以了解某个表的历史操作记录,这个操作记录对应一个撤销SQL语句,如果想要撤销这个操作,就可以执行这个SQL语句。
Flashback_transaction_query
名称 类型 说明
------------------------------------------------------------------------------------------------
XID RAW(8) 事务编号
START_SCN NUMBER 事务的开始的系统改变号
START_TIMESTAMP DATE 事务的开始时间
COMMIT_SCN NUMBER 事务提交时的系统改变号
COMMIT_TIMESTAMP DATE 事务提交时的时间
LOGON_USER VARCHAR2(30) 对应的用户
UNDO_CHANGE# NUMBER 撤销操作对应的编号
OPERATION VARCHAR2(32) 操作
TABLE_NAME VARCHAR2(256) 表
TABLE_OWNER VARCHAR2(32) 所有者
ROW_ID VARCHAR2(19) 行号
UNDO_SQL VARCHAR2(4000) 撤销事务的SQL语句
注意,要查询flashback_transaction_query视图的信息,需要有select any transaction的权限。
SQL> --如何撤销第二个事务? ----闪回事务查询
SQL> --授权select any transaction给scott
SQL> conn / as sysdba
已连接。
SQL> grant select any transaction toscott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> /*
SQL> 闪回事务查询的步骤:1
SQL> 1. 通过闪回版本查询获取事务号(xid)
SQL> 2. 通过xid查询Flashback_transaction_query,获取undo_sql
SQL> */
SQL> select tid,tname,versions_operation,versions_starttime,versions_endtime,versions_xid
2 from transaction_table
3 versions between timestampminvalue and maxvalue
4 order by versions_xid;
TID TNAME V VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID
2 Mary123 U 21-9月 -11 11.13.24 上午 0400140020040000
3 Mike D 21-9月 -11 11.13.24 上午 0400140020040000
2 Mary I 21-9月 -11 11.12.39 上午 21-9月 -11 11.13.24 上午 0700250012040000
1 Tom I 21-9月 -11 11.12.39 上午 0700250012040000
3 Mike I 21-9月 -11 11.12.39 上午 21-9月 -11 11.13.24 上午 0700250012040000
SQL> -- 执行闪回事务查询
SQL> select operation,undo_sql
2 fromFlashback_transaction_query
3 where xid=&#39;0400140020040000&#39;;
OPERATION
--------------------------------
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------
DELETE
insert into"SCOTT"."TRANSACTION_TABLE"("TID","TNAME")values (&#39;3&#39;,&#39;Mike&#39;);
UPDATE
update"SCOTT"."TRANSACTION_TABLE" set "TNAME" = &#39;Mary&#39;where ROWID = &#39;AAANiBAAEAAAAG3AAB&#39;;
BEGIN
SQL> update"SCOTT"."TRANSACTION_TABLE" set "TNAME" = &#39;Mary&#39;where ROWID = &#39;AAANiBAAEAAAAG3AAB&#39;;
已更新 1 行。
SQL> insert into"SCOTT"."TRANSACTION_TABLE"("TID","TNAME")values (&#39;3&#39;,&#39;Mike&#39;);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from TRANSACTION_TABLE;
TID TNAME
---------- --------------------
1 Tom
2 Mary
3 Mike
SQL> host cls
SQL> spool off















Oracle查询闪回删除闪回表闪回flashback 
  Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。闪回数据库是进行时间点恢复的新方法,它能够快速将Oracle恢复到以前的时间,以更正由于逻辑数据损坏或用户错误而引起的问题。当需要恢复时,可以将数据库恢复到错误前的时间点,并且只恢复改变的数据块。
Oracle中的闪回操作包括以下4种:
(1)查询闪回:查询过去某个指定时间、指定实体的数据,恢复错误的数据库更新、删除等。
(2)表闪回:使表返回到过去的某一时间的状态,恢复表、取消对表进行的修改。
(3)删除闪回:可以将删除的表重新恢复。
(4)数据库闪回:可以将整个数据库回退到过去的某个时间点。

1、查询闪回
查询闪回可以查看过去某一时点的任何数据,如果要查询某一表在某一时点的内容,可以把查询目标对象定位为该表在某一时点的表,表在某一时刻的表可以如下表示:
 
Sql代码  
table_name as of timestamp real_timestamp; --它作为一个整体表示一个表*/  
 
例如,要查询person表在2012-6-2 19:00:00的状态,可以使用如下语句:
 
Sql代码  
select * from person as of timestamp to_timestamp('2012-6-2 19:00:00', 'yyyy-mm-dd HH24:mi:ss');  
 
知道了表在某一时刻的表之后,我们就可以很容易的把表恢复到某一时刻的样子了,例如我们在2012-6-2 19:00:00这个时候删除了person表中的3条记录,之后我又想把它恢复,那应该如何恢复呢?利用查询闪回我们可以这样操作:
方法一:
第一步,把当前表中的数据全删了:delete from person;
第二步,我们通过查询闪回把2012-6-2 19:00:00这个时点之前的数据拿出来然后插入到当前表中,调用语句如下:
 
Sql代码  
insert into person select * from person as of timestamp to_timestamp('2012-6-2 18:59:59', 'yyyy-mm-dd HH24:mi:ss');  
 
方法二:
先找出从person表中删除的记录,然后再把它们插到person表中,Sql语句如下:
 
Sql代码  
insert into person select * from person as of timestamp to_timestamp('2012-6-2 18:59:59', 'yyyy-mm-dd HH24:mi:ss') p where not exists(select * from person where id=p.id);  
 
因为查询闪回是跟时间有关系的,所以说到这就再说一个设置,在sqlplus中输入set time on语句可以打开时间显示功能,这会使得在每次执行语句后都会在该语句的前面显示该语句的执行时间,使用set time off语句可以关闭该功能。

2、表闪回
利用表闪回可以轻松的取消对表的修改。只有Oracle的企业版才能进行表闪回。
对进行表闪回的表必须row movement为enable。
表闪回的语法格式如下:
 
Sql代码  
flashback table [schema.]table_name[,...n] to {[scn] | [timestamp] [[enable | disable] triggers]};  
 
其中,
scn:表示系统改变号,可以从flashback_transaction_query数据字典中查询。
timestamp:表示通过时间戳的形式来进行闪回。
enable|disable triggers:表示触发器恢复之后的状态,默认为disable。
示例代码:
(1)确保需要闪回的表row movement为enable:
 
Sql代码  
alter table hello enable row movement;  
 
(2)对表进行闪回:
 
Sql代码  
flashback table hello to timestamp to_timestamp('2012-6-3 14:00:00','yyyy-mm-dd HH24:mi:ss');--恢复表到2012-6-3 14:00:00这个时候的样子*/  
 

3、删除闪回
在Oracle数据库中有一个叫recyclebin的回收站,当回收站的功能是启用的时候,被用户drop的对象都会保存在recyclebin中,普通用户可以通过select * from recyclebin;语句查看被自己drop掉的对象的相关信息,当然如果普通用户想查看所有用户的recyclebin信息也是可以的,可以通过查看dba_recyclebin视图,DBA用户不存在recyclebin。来获取,如:select * from dba_recyclebin。如果被删除的对象不是彻底删除,而是放到了回收站的话,我们就可以在需要的时候从回收站中进行恢复了。
为了避免被删除的表与其他对象存在名称冲突,Oracle对被删除的对象进行了重命名,当然Oracle也保存了对象的原始名称。在进行对象恢复的时候可以使用对象的原始名称,也可以使用被重新命名的新名称。
系统参数recyclebin控制表删除后是否到回收站,show parameter recyclebin可以查看该参数的状态。
对于系统参数的修改有两种,全局的修改和会话的修改:
(1)alter system set param_name=param_value;
(2)alter session set param_name=param_value;
show recyclebin:可以显示当前用户recyclebin中的表。
purge tablespace tablespace_name:用于清空指定表空间的recyclebin;
purge tablespace tablespace_name user username:清空指定表空间的recyclebin中指定用户的对象。
purge table table_name:清除回收站中的指定表对象。如:purge table hello语句则将清除回收站中的hello表。这里的table_name既可以是原来的表对象名,也可以是
recyclebin中自动生成的名字。
purge recyclebin:删除当前用户的recyclebin中的对象。
purge dba_recyclebin:删除所有用户的recyclebin中的对象
drop table table_name purge:删除对象且不放在recyclebin中。

删除闪回的语法格式如下:
 
Sql代码  
flashback table table_name to before drop [rename to new_name]; --恢复表table_name并重命名为new_name*/  
 
示例代码:
 
Sql代码  
flashback table hello to before drop rename to dropped_hello;  
 

4、数据库闪回
数据库闪回可以使数据库回到过去某一时间点或SCN的状态,用户可以不用备份就能快速地实现时间点的恢复。只有Oracle的企业版才能进行数据库闪回。
(以后进行完善)

猜你喜欢

转载自zhyp29.iteye.com/blog/2303270
今日推荐