1、闪回数据库 Flashbackdatabase(根据误操作时间闪回数据)
·DB_RECOVER_FILE_DEST
·DB_RECOVER_FILE_DEST_SIZE
这两个参数来确定Flashback日志的存放地点与该恢复区的大小。在创建数据库的时候,Oracle将自动创建恢复区(需要注意,该恢复区可不仅仅是为了flashbacklog,还可以用来归档,备份与恢复),但是默认是关闭Flashback database功能。如果想要利用这一功能,DBA就必须正确的配置该日志区的大小,如一个数据库的数据库,每天有10%的块发生改变,那么一天(24小时)的Flash Recovery Area就是1/10个数据库大小。DBA也可以动态的改变其大小以满足不同的需求。
另外一个参数DB_FLASHBACK_RETENTION_TARGET参数允许您设定闪回数据的保存时间,单位是分。默认是一天(24*60)
SQL> startup mount
ORACLE instance started.
Total System Global Area 113246208 bytes
Fixed Size 787708 bytes
Variable Size 87030532 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
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 13
Next log sequence to archive 15
Current log sequence 15
经过以上步骤,我们确保了flashback database的功能,我们还可以发现,10g的自动归档是不需要手工干预的,只要开启了归档,就是自动归档了,归档区也在DB_RECOVERY_FILE_DEST参数指定的地点。
通过如下的查询
SQL> alter session setnls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> SELECTOLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME
2 FROMV$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCNOLDEST_FLASHBACK_TI
-------------------- -------------------
875155 2007-05-20 21:45:50
我们可以知道,可以前滚恢复到的最早的SCN与时间点是多少,如果没有确保flashback database,该视图将没有查询结果。
注意:truncate 的数据用Flashback 的 Flashback database 恢复。
没有备份,我们利用flashback来恢复数据库到2007-05-20 21:45:50时间点。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
SQL> FLASHBACKDATABASE TO timestamp(to_date('2007-05-20 21:45:50','yyyy-mm-dd hh24:mi:ss'));
Flashback complete.
发现truncate的记录或者是drop的表都存在,现在数据库已经前滚到前一个时间点了。
之后,我们可以用ALTERDATABASE OPEN READ ONLY来检查结果是否正确,如果满足结果,则可以用resetlog来正式启动数据库,注意,一旦resetlogs之后,将不能再flashback的resetlogs之前的时间点。
15:41:32 SQL> alter database openresetlogs;
Database altered.
SQL> SELECT OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME
2 FROMV$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
8751552007-05-20 21:45:50
同时发现数据库的最早的flashback的时间与scn都回到resetlog的时间点了。
2、闪回delete的数据 flashback table(根据误操作时间闪回数据)
SQL> flashbacktable test1 TO TIMESTAMP to_timestamp('2007-05-20 22:20:10','yyyy-mm-ddhh24:mi:ss');
Flashback complete.
我们可以发现,执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的.
还可以看到,对于drop的索引,也是没有办法恢复的,因为drop并不记录undo。
3、闪回drop的表flashbackdrop
对于truncate的表,除了flashback database之外,其它的flashback功能可能不可恢复。
所谓的回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,对于一个对象的删除,其实仅仅就是简单的重令名操作。你甚至还可以对已经删除的表查询,也可以利用flashback功能来恢复它, 这个就是flashbackdrop功能。
关于回收站内的相关信息可以从recyclebin/USER_recyclebin/DBA_recyclebin等视图中获取,或者通过SQL*Plus的show recyclebin 命令查看
通过下面语句查看drop操作过的表名
SQL> showrecyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------------------ -------------------
TEST1 BIN$nwjcjTOtQUirZW4H1wlFVA==$0 TABLE 2007-05-20:22:37:18
可以将表恢复到删除之前。如
SQL> FLASHBACKTABLE test1 TO BEFORE DROP;
或者
SQL> FLASHBACKTABLE “BIN$nwjcjTOtQUirZW4H1wlFVA==$0” TO BEFORE DROP;
Flashback complete.
可以看到,表TEST1已经被恢复了,需要注意的是,flashback命令中的表名可以是原来的名字或者是回收站中的名称,都无所谓。如果原来的名称在回收站中存在同名,那么将恢复最后drop的表。
SQL> purge recyclebin;
Recyclebin purged.
SQL> show recyclebin
之后,可以看到,回收站中已经没有任何信息
如果删除一个表,而不想放到回收站中,可以利用purge选项在drop语句中,如
drop table tablename purge
另外,还有一些需要注意的地方
·drop tablespace tsname including contents时,表空间内的所有对象包括回收站内的对象都将被清除。
·如果仅仅是drop tablespace时,如果有永久对象将不能执行,如果仅仅是有回收站内的对象,将先清除回收站,然后删除表空间
·如果drop user username cascade时,所有对象将被删除,而且不放入回收站