一•启用闪回数据库 1.启用归档模式 sql>shutdown immediate; sql>startup mount; sql>alter database archivelog; 2.建立闪回区 sql>alter system set db_recovey_file_dest='/opt/oracle/flash_recovery_area' scope=both; sql>alter system set db_recovery_file_dest_size=3g scope=both; 3.设置闪回数据库的数据保留周期为一天,以min为单位 sql>alter system set db_flashback_retention_target=1440; 4.启用闪回日志 sql>alter database flashback on; sql>alter database open;

二•使用scn闪回数据库 1.查询数据库系统当前的scn(记下此scn) sql>select current_scn from v$database; 2.改变数据库的当前状态,模拟创建表test1,并插入1条数据 create table test1(id number,name char(20)); insert into test1 values(1,'data'); commit; 3.进行闪回数据库恢复,将数据库恢复到创建表之前的状态 SQL> select OLDEST_FLASHBACK_SCN from v$FLASHBACK_DATABASE_LOG;(查看scn) shutdown immediate startup mount; flashback database to scn 之前查到的scn 4.最后使用resetlogs选项打开数据库 alter database open resetlogs; 5.验证数据库的状态(test1表应该不存在) SQL> select * from test1; select * from test1 * ERROR at line 1: ORA-00942: table or view does not exist

6.按照指定时间闪回数据库 1)设置显示日期格式 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select sysdate from dual;(查看系统时间) 2)改变数据库的当前状态,模拟创建表test2,并插入1条记录 sql>set time on; sql>create table test2(id number,name char(20)); sql>insert into test2 values(1,'data'); sql>commit; sql>shutdown immediate; sql>startup mount; sql>flashback database to timestamp(to_timestamp('......'));(....即为前面查看到系统时间) sal>alter database open resetlogs; sql>select * from test2; ERROR at line 1: ORA-00942: table or view does not exist(显示test2表不存在) 说明:闪回数据库操作的限制 1)数据文件损坏或丢失等介质故障不能使用闪回数据库进行恢复。闪回数据库只能基于当前正常运行的数据文件。 2)闪回数据库功能启动后,如果发生数据库控制文件重建或利用备份恢复控制文件,则不能使用闪回数据库 3)不能使用闪回数据库进行数据文件收缩操作 4)不能使用闪回数据库将数据库恢复到闪回日志中可获得最早的SCN之前的SCNM,因为闪回日志文件在一定条件下被删除,而不是始终保存在闪回恢复区中

三、闪回表 闪回表可将表恢复到特定的时间点或者指定的SCN 闪回表实际上是对表进行DML操作的过程 数据库保持联机 为了使用数据库闪回表功能,必须满足下列条件: 用户具有FLASHBACK ANY TABLE系统权限,或者具有所操作表的FLASHBACK对象权限 用户具有所操作表的SELECT,INSERT,DELETE,ALTER对象权限 启动被操作表的ROW MOVEMENT特性,可以采用下列方式进行 ALTER TABLE table ENABLE ROW MOVEMENT; 注意 SYS用户或以AS SYSDBA身份登录的用户不能执行闪回表操作

1.使用scott用户登录 sql>alter user scott account unlock; sql>alter user scott identified by 123456; sql>grant connect,resource to scott; sql>conn scott/123456; set time on; sql>create table test3(id number,name char(20)); sql>insert into test3 values(1,'zhang'); commit; sql>insert into test3 values(2,'zhao'); commit; sql>insert into test3 values(3,'wang'); commit; 以sys身份连接数据库,并授予scott用户select any dictionary的权限,并最后以scott身份查看当前的scn conn / as sysdba grant select any dictionary to scott; SQL>set time on sql>conn scott/123456; sql>select current_scn from v$database;记下此scn sql>update test3 set name='liu' where id=1; sql>commit; sql>select * from test3; sql>delete from test3 where id=3; sql>commit; sql>select * from test3 2.启动test3表的row movement特性 sql>alter table test3 enable row movement; sql>flashback table test3 to timestamp to_timestamp(。。。。);

四、闪回删除 闪回删除可恢复使用DROP TABLE语句删除的表,是一种对意外删除的表的恢复机制 闪回删除功能的实现主要是通过数据库中的“回收站”(Recycle Bin)技术实现的 为了使用闪回删除技术,必须开启数据库的“回收站” 启动“回收站” 查看“回收站” 闪回删除的基本语法为 FLASHBACK TABLE [schema.]table TO BEFORE DROP [RENAME TO table] 注意 不支持SYS用户,SYSTEM表空间下的对象也不能从回收站里拿到。故使用SYS或者SYSTEM用户登录时,查询为空

1.启动回收站,将参数recyclebin设置为on,在默认情况下回收站已经启动 SQL> conn / as sysdba; sql>show parameter recyclebin; sql>alter system set recyclebin=on deferred; 2.查看回收站,不支持从sys用户,system表空间的对象也不能从回收站里拿到,所以要切换到scott用户测试 sql>conn scott/123456; create table test4(id number,name char(20)); sql>insert into test4 values(3,'wang') sql>commit; sql>drop table test4; sql>select object_name,original_name,type from user_recyclebin; 闪回表并重命名为new_test4 sql>flashback table test4 to before drop rename to new_test4;

五•闪回查询 sql>conn scott/123456; sql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; sql>set time on; sql>select empno,sal from scott.emp where empno=7844; sql>update scott.emp set sal=2000 where empno=7844; sql>commit; sql>update scott.emp set sal=2500 where empno=7844; sql>update scott.emp set sal=3000 where empno=7844; sql>commit; 查询7844员工前一个小时的工资值 sql>select empno,sal from scott.emp as of timestamp sysdate-1/24 where empno=7844