闪回数据库(FLASHBACK DATABASE)是oracle数据库非常重要的一项功能,与通过undo 获取表数据的历史版本进而执行逻辑错误恢复的功能相比,flashback database 的功能完全不同:undo数据是针对整个数据库的;undo数据的保存时间是有限的;undo 的本质是为了保持数据的一致性。而flashback database可以只针对某表空间保存历史数据,并且只要存储空间允许,flashback database可以保存任意长的历史时间。flashback database 日志中存储的是数据库数据的前镜像。
闪回数据库整个架构包括一个进程(rvmr),一段存储空间(flash recovery area),一种日志(flashback database log)。数据块的”前镜像“存储在闪回日志中(flashback database log)。
启用闪回数据库
要想使用Flashback Database, 必须使用Flash Recovery Area。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.参数db_flashback_retention_target控制闪回日志的保留时间,默认是1440,即24小时。
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oraele/fast_recovery_
area
db_recovery_file_dest_size big integer 4122M
SQL> show parameter flashback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 5 Next log sequence to archive 7 Current log sequence 7要开启闪回数据库功能,可以使用alter database flashback on;
在11g下,可以在mount和open模式来执行该命令:
SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> alter database flashback on; Database altered. SQL> select status from v$instance; STATUS ------------ OPEN
在10g下,需要在mount状态下,执行该命令
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi PL/SQL Release 10.2.0.5.0 - Production CORE 10.2.0.5.0 Production TNS for Linux: Version 10.2.0.5.0 - Production NLSRTL Version 10.2.0.5.0 - Production SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO SQL> select status from v$instance; STATUS ------------ OPEN SQL> alter database flashback on; alter database flashback on * ERROR at line 1: ORA-38759: Database must be mounted by only one instance and not open.
创建实验表
SQL> truncate table test;
Table truncated.
SQL> insert into test values((select count(*) from test),(select current_scn from v$database));
1 row created.
SQL> commit;
Commit complete.
SQL> insert into test values((select count(*) from test),(select current_scn from v$database));
1 row created.
SQL> commit;
Commit complete.
SQL> insert into test values((select count(*) from test),(select current_scn from v$database));
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test;
ID SCN
---------- --------------------
0 1121575
1 1131647
2 1142043
在执行完flashback database 命令之后,可以使用多种方式修复数据库:
1). 直接alter database open resetlogs 打开数据库,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,查看恢复后的数据是否满足要求,如果满足要求,则通过resetlogs打开数据库,否则,重新执行flashback 操作。
3). 先执行al