1.Flashback    在oracle 9i中引入flashback查询,以便能在需要的时候查到过去某个时刻的一致性数据,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。如果undo 被覆盖了就不能进行查询。oracle10g中增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),这个区域默认创建在oracle_base目录下。可以将所有恢复相关的文件,比如flashbacklog,archive log,backup set等,放到这个区域集中管理。
1.1 查看数据库flashback是否打开(select t.FLASHBACK_ON  from v$database t)要打开flashback技术,数据库必须处于归档模式(archivelog:alter database archivelog),否则数据库会出现一下错误:
 
SQL> alter database flashback on;
 alter database flashback on
 *
 第 1 行出现错误:
 ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
 ORA-38707: 尚未启用介质恢复。
1.1.2.查看oracle是否处于归档模式:archive log list
 
SQL> archive log list;
 数据库日志模式            存档模式
 自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
 最早的联机日志序列     13
 下一个存档日志序列   15
 当前日志序列           15
1.2 更改数据库为mount状态,alter database mount;
打开flashback:
SQL> alter database flashback on;
1.3.闪回恢复区
            db_recovery_file_dest:指定闪回恢复区的位置
            db_recovery_file_dest_size:指定闪回恢复区的可用空间大小            db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。
 
SQL> show parameter db_recover
NAME                                 TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
 db_recovery_file_dest                string      C:\oracle\product\10.2.0/flash_recovery_area
 db_recovery_file_dest_size           big integer 2GSQL> show parameter db_flash
NAME                                 TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
 db_flashback_retention_target        integer     1440           我们看到db_flashback_retention_target 默认是1440分钟,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。
1.4.检查恢复区的使用情况
 
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
 ------------ ------------------ ------------------------- ---------------
 CONTROLFILE                   0                         0               0
 ONLINELOG                     0                         0               0
 ARCHIVELOG                    0                         0               0
 BACKUPPIECE                   0                         0               0
 IMAGECOPY                     0                         0               0
 FLASHBACKLOG                .57                       .38               2已选择6行。
1.5.数据库的恢复(Flashback Database:数据库必须处于归档模式并且flashback必须打开)
flashback技术可以以两种模式恢复,timestamp 或者SCN
Flashback Database操作示例 :
1.5.1.查看当前scn
 
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
 -----------
     10052051.5.2.查看当前时间
 
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
 -----------------
 12-07-30 14:10:331.5.3.Flashback Database实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态
 
SQL> shutdown immediate;
数据库已经关闭。
 已经卸载数据库。
 ORACLE 例程已经关闭。SQL> startup mount;
ORACLE 例程已经启动。Total System Global Area  293601280 bytes
 Fixed Size                  1248600 bytes
 Variable Size              96469672 bytes
 Database Buffers          188743680 bytes
 Redo Buffers                7139328 bytes
 数据库装载完毕。 
1.5.4执行恢复(timestamp)
 
SQL> Flashback database to timestamp to_timestamp('12-07-30 14:10:33','yy-mm-dd
 hh24:mi:ss');闪回完成。
或则
Flashback database to scn 1005205;
1.5.5.打开数据库
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only命令,以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
 
这里演示,就以resetlogs方式打开:
1.5.6.打开数据库
 
SQL> alter database open resetlogs;
数据库已更改。