Flashback in Oracle

Flashback in Oracle

FLASHBACK #

Flashback Database 整个架构包括:

  1. Recover Writer(RVWR)后台进程
  2. Flashback Database Log日志
  3. Flash Recovery Area

一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log,这些日志包括的是数据块的"前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。

Flashback技术的局限性

查看当前模式 #

SELECT name,flashback_on FROM V$DATABASE;

启用FLASHBACK模式 #

  1. 设定以下参数
alter system set db_recovery_file_dest='C:/oracle/product/10.2.0/flash_recovery_area' scope=both;
alter system set db_recovery_file_dest_size = 10G scope=both;

10G的容量偏少,如果这个空间用完,数据库会无法访问,在该值改好前,也无法关闭数据库。

alter system set db_flashback_retention_target = 1440 scope=both;
  1. 重启数据库到mount状态,执行下面的命令
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;

相关视图 #

  1. V$FLASH_RECOVERY_AREA_USAGE
  2. V$FLASHBACK_DATABASE_LOG Flashback Database所能回退到的最早时间,取决于保留的Flashback Database Log 的多少。
  3. V$FLASHBACK_DATABASE_STAT

对Flashback log空间情况进行更细粒度的记录和估计。这个视图以小时为单位记录数据库的活动量, Flashback_Data 代表Flashback log产生数量, DB_Data代表数据改变数量, Redo_Data代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求。

查询FLASHBACK #

  1. 授予权限 CONNECT sys/change_on_install AS sysdba GRANT EXECUTE ON SYS.DBMS_FLASHBACK TO store;
  2. 基于时间的FLASHBACK EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE – 10 / 1440); 闪回到10分钟前 EXECUTE DBMS_FLASHBACK.DISABLE(); 取消前次闪回
  3. 基于SCN的FLASHBACK VARIABLE current_scn NUMBER EXECUTE :current_scn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); PRINT current_scn EXECUTE DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:current_scn); EXECUTE DBMS_FLASHBACK.DISABLE(); 取消前次闪回

Flashback DROP #

RECYCLEBIN FLASHBACK无法恢复TRUNCATE操作后的表。

删除Flashback log #

Flashback log是不能手动删除的,系统在碰到下面两种情况下可以自动删除flashback log:

  1. If the flash recovery area is full, then an archived redo log may be automatically deleted by the flash recovery area to make space for other files. In such a case, any flashback logs that would require the use of that redo log file for the use of FLASHBACK DATABASE are also deleted.
  2. If the database needs to create a new flashback log and the flash recovery area is full or there is no disk space, then the oldest flashback log is reused instead.

有一种触发系统自动删除flashback log的方法:

  1. shutdown immediate
  2. startup mount
  3. alter database flashback off

关闭flashback,然后再开启,系统会清除flashback log。事实上,只要db_flashback_retention_target的值不是太大,flashback log占据的空间也不会很大。当flashback log的空间用去好几十G时,很有可能是设置了restore point。查询v$restore_point可获取当前有效的restore point,restore point之后的flashback log会一直保留,直至删除restore point。因此,一个开启的flashback功能的数据库,最好不要有长期的restore point放在那里,restore point只适合短期使用,用完后要记得删除。

From #