oracle 闪回

一.闪回概述

  如果你对数据误操作,并已提交,这时想回退该误操作,将会是件麻烦的事情。但是,oracle推出了Flashback技术,主要目的就是为了恢复误操作。

  在oracle 10g中,Flashback家族分为以下成员:Flashback Database, Flashback Drop, Flashback Query(分Flashback Query, Flashback Version Query, Flashback Transaction Query三种)和Flashback Table

  在oracle 11g中,又出了一个新特性:Oracle Flashback Data Archive

二.闪回恢复区

2.1).oracle查看闪回恢复区设置

C:\app\admin\product\11.2.0\dbhome_1\BIN>sqlplus / as sysdba

SQL> show parameter recov;

 

如果闪回恢复区大小为0,并且闪回恢复区目录未设置,则闪回未开启。可以直接设值,即可开启闪回功能。

开启闪回功能:

SQL> ALTER SYSTEM SET db_recovery_file_dest_size=3g SCOPE=BOTH;    -----设置闪回恢复区大小为3g

SQL> ALTER SYSTEM SET db_recovery_file_dest='C:\app\admin\flash_recovery_area' SCOPE=BOTH;    -----设置闪回恢复区目录

取消闪回功能:

SQL> ALTER SYSTEM SET db_recovery_file_dest='';    -----设置闪回恢复区目录为空即可

 

2.2).闪回恢复区内容

所有和恢复相关的文件都可以存放到闪回恢复区

SQL> select file_type from v$flash_recovery_area_usage;

FILE_TYPE
--------------------
CONTROL FILE    --控制文件
REDO LOG      --redo日志
ARCHIVED LOG    --归档日志
BACKUP PIECE     --备份文件
IMAGE COPY      --备份的镜像文件
FLASHBACK LOG
FOREIGN ARCHIVED LOG

7 rows selected.

2.3).闪回恢复区的空间管理

  闪回恢复区中添加或删除文件等变化都将记录在数据库的alert日志中,oracle 10g开始也针对该新特性提供了一个新的视图,DBA_OUTSTANDING_ALERTS,通过该视图可以得到相关的信息。

  在闪回恢复区中的空间使用超过85%的时候,数据库将会向alert文件中写入告警信息。而当超过97%的时候将会写入严重告警信息。当闪回恢复区空间不够的时候,oracle将报告如下类似的错误:

 

 

   这个时候查询

  SQL> select reason,object_type,suggested_action from dba_outstanding_alerts;

  v$Recovery_file_dest视图包含闪回恢复区的相关信息:

  SQL> select * from v$Recovery_file_dest;

  通过查询v$Recovery_file_dest,可以获得当前闪回恢复区的空间使用情况,并且可以知道是哪些文件占用了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。

  视图v$flash_recovery_area_usage可以查看当前各种文件占用空间情况  

  SQL> select * from v$flash_recovery_area_usage;

 

三.Flashback Database(将数据库闪回到之前的某个状态,一般不用)

  Flashback Database功能非常类似RMAN的不完全恢复,它可以把整个数据库回退到过去产的某个时点的状态,这个功能依赖于Flashback log日志。比RMAN更快速和高效。因此Flashback Database可以看作是不完全恢复的替代技术。但它也有某些限制:

(1)Flashback Database不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择。

(2)如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用 Flashback Database.

(3)使用Flashback Database能恢复到的最早的SCN, 取决于Flashback Log中记录的最早SCN.

3.1).启动Flashback database

  数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,需要两个前提:

  打开归档,需要在mount状态下打开;在设置了闪回恢复区后,可以启动闪回数据库功能。

  打开归档步骤:

  startup mount;

  alter database archivelog; --开启归档

  alter database open;

  SQL> archive log list; --数据库必须已经处于归档模式

  SQL> shutdown immediate;

  SQL> startup mount;

  SQL> alter database flashback on;

  SQL> alter database open;

  SQL> select flashback_on from v$database;

 

四.Flashback Drop(只针对drop)

  Flashback Drop是从Oracle 10g开始出现的,用于恢复用户误删除的对象(包括表,索引等),这个技术依赖于Tablespace Recycle Bin(表空间回收站)

  Flashback Drop只支持闪回与table相关连的对象,比如表,索引,约束,触发器等。如果是函数或存储过程等,就需要使用Flashback Query来实现。

  查看Recycle Bin状态

  SQL> show parameter recycle;

  缺省是ON,可以使用OFF关闭。禁用后删除的对象将直接删除,不会写到recycle中,当然在删除时,指定purge参数,表也将直接删除,不会写到recyclebin中。

  SQL> alter system set recyclebin=off;

  SQL> alter system set recyclebin=on;

  SQL> drop table name purge;

  查看recyclebin中的对象:

  SQL> select original_name, object_name from recyclebin;

 

  闪回例子

  SQL> conn scott/123456;

  SQL> select table_name from user_tables;

  

 

  

  

   闪回

  SQL> flashback table t1 to before drop;

  

  SQL> select original_name, object_name from recyclebin;

  no rows selected

 

  以下几种drop不会将相关对象放进回收站中

  1.drop tablespace:会将recyclebin中所有属于该tablespace的对象清除

  2.drop user:会将recyclebin中所有属于该用户的对象 清除

  3.drop cluster:会将recyclebin中所有属于该cluster的成员对象清除

  4.drop type:会将recyclebin中所有依赖该type对象清除

 

五.Flashback Query

   Flashback Query(分Flashback Query, Flashback Version Query, Flashback Transaction Query三种)

  闪回查询(Flashback Query),查询某个时间点之前的表数据

  SQL> select * from t1 as of timestamp to_timestamp('2020-02-29 15:28:00', 'yyyy-MM-DD hh24:mi:ss');

 

  闪回版本查询(Flashback Version Query),查询t1表的操作记录

  SQL> select versions_xid, versions_startscn, versions_endscn, decode(versions_operation, 'I', 'Insert', 'U', 'Update','D','Delete', 'Original') "Operation", id from t1 versions between scn minvalue and maxvalue;

  

 

 

   闪回事务查询(Flashback Transaction Query),可以构建回闪回的恢复语句。数据库需要开启增强日志。但是开启增强日志,数据库的归档日志会更大,所以一般建议不开启增强日志。

  缺省情况下,Oracle不启用任何附加日志。当使用ALL,PRIMARY,UNIQUE或FOREIGN附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。 在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。
 
  查询当前设置

  SQL> conn system/oracle;
  SQL>SELECT supplemental_log_data_min min,
       supplemental_log_data_pk pk,
       supplemental_log_data_ui ui,
       supplemental_log_data_fk fk,
       supplemental_log_data_all allc
  FROM v$database;

  

  MIN PK UI FK ALL
  -------- --- --- --- ---
  NO NO NO NO NO

  开启增强日志

  SQL> conn system/oracle;

  SQL> alter database {add|drop} supplemental log data;

  执行表操作

  SQL> conn scott/123456;

  SQL> delete from t1 where id=3;

  SQL> commit;

  SQL> insert into t1 values(5);

  SQL> commit;

  查询闪回记录

  SQL> conn system/oracle;

  SQL> grant select any transaction to scott;    -- scott用户没有对flashback_transaction_query的查询权限,所以先要给scott赋权限

  SQL> conn scott/123456;

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

  

 

posted @ 2020-02-29 15:53  piaoyang  阅读(274)  评论(0)    收藏  举报