flashback——oracle

oracle10g的回闪包括以下特性;
1〉oracle falshback Database. 特性允许oracle通过Flashback database语句,将数据库会滚到前一个时间点或者scn上,而不需要作时间点的恢复工作!
2〉oracle falshback table. 特性允许oracle通过flashback table语句,将表会滚到前一个时间点或者scn上。
3〉oracle falshback drop. 特性允许oracle把恢复drop掉的table或者索引。
4〉oracle falshback version query. 特性可以得到特定的表在某一个时间段内的任何修改记录!
5〉oracle falshback transaction query 特性可以限制用户在某一个事务级别上检查数据库的修改操作,适用于诊断问题、分析性能、审计事务。

1: flashback table tablename to befor drop;

此操作需要用户有以下的权限:
A:falshback any table的系统权限或者是某一个表的flashback权限。
B:有table的select、insert、delect、alter权限。
C:有table的row Movement权限
附:--关于scn的介绍:
SCN:system change numbers,oracle10g的每一个表都有ora_rowscn列!但是desc是看不到改列的。
可以通过select ora_rowscn from table 得到每一条结果集当前的SCN,scn_to_timestamp()将scn转换到timestamp;timestamp_to_scn()将timestamp转换到scn。

2:flashback table a to timestamp to_timestamp('2010-01-27 11:45:20','yyyy-mm-dd hh24:mi:ss');

执行闪回操作时可能会提示错误:


ORA-08189: cannot flashback the table because row movement is not enabled

解决方式:SQL> alter table a enable row movement;

Table altered.
这个命令的作用是,允许Oracle修改分配给行的rowid。在Oracle 中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。闪回表处理会对EMP 完成DELETE,并且重新插入行,这样就会为这些行分配一个新的rowid。要支持闪回就必须允许Oracle 执行这个操作
3:flashback table a to scn 1576479;


4:oracle falshback version query--闪回版本查询

select * from a as of scn 1577059;select * from a as of timestamp scn_to_timestamp(1577059);

5:oracle falshback Database:闪回数据库在10g 中Flashback又得到了相当大的增强,利用Recycle Bin(回收站)和Flash Recovery Area(闪回区)的特性实现快速恢复删除表(Flashback Table)或做数据库时间点恢复(Flashback Database)的功能。
    要使用flashback 的特性,必须启用自动撤销管理表空间,不仅是flashback query,也包括flashback table 和flashback database,而对于后两项还会有些其它的附加条件,比如flashback table 需要启用了recycle bin(回收站),flashback database 还要求必须启用了flashback area(闪回区)。
SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_tablespace                      string      UNDOTBS1
在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会
覆盖,例如:
SQL> Alter tablespace undotbs1 retention guarantee;
如果想禁止undo 表空间retention guarantee,如例:
SQL> Alter tablespace undotbs1 retention noguarantee;
如果说flashback query 可用来恢复指定时间点的记录,flashback table 可用来恢复被删除或指定时间点的表,而flashback database,则直接提供一个数据库级别的恢复,可将数据库恢复到指定的时间点,相对于前两者,其粒度是最大的。

1、必备条件

A. 数据库启用了flashback database。
B. 数据库必须打开了flash recovery area,如果数据库是RAC,flash recovery area 必须位于共享存储中。
C. 数据库必须处于archivelog 模式。

2、操作示例

Flashback database 即可以在rman 中执行,也可以在sql*plus 中执行,其命令格式都是一样的,在这个示例中,我们所有操作都是在sql*plus 中执行。

A. 检查是否启动了flash recovery area:
SQL> show parameter db_recovery_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /orahome/flash_recovery_area
db_recovery_file_dest_size           big integer 2G

B. 检查是否启用了归档
SQL> archive log list;

C. 检查是否启用了flashback database 和force_logging
SQL> select flashback_on,force_logging from v$database;
FLASHBACK_ON       FOR
------------------ ---
NO                 NO
如果未启用则先启用:
SQL> alter system set db_flashback_retention_target=1440 scope=both;   (单位是分钟,1440表示一天)
SQL> shutdown immediate;
SQL> startup mount exclusive;
SQL> alter database flashback on;
SQL> alter database force logging;
SQL> select flashback_on,force_logging from v$database;
FLASHBACK_ON       FOR
------------------ ---
YES                YES
SQL> alter database open;

D. 查询当前的scn
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
     248739

E. 模拟误删除操作
SQL> 做一些DML/DDL操作

F. 重新启动到mount 状态,然后执行恢复
SQL> conn /as sysdba
SQL> shutdown immediate
SQL> startup mount
SQL> flashback database to scn 248739;
提示:此处flashback database to timestamp 也是一样的,不过你需要估计好恢复到的时间点。

注意此处,在你执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
第一种直接 alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
另一种方式是先执行 alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

G. 打开数据库
SQL> alter database open resetlogs;

H. 验证数据
SQL> 查询误操作的数据是否回到了从前

猜你喜欢

转载自t240178168.iteye.com/blog/1681756