一、使用Oracle10g的Flashback Query进行数据闪回
Oracle10g对于闪回查询进行了增强,支持更简单的SQL操作,允许对误删除、误更新等DML操作进行闪回。
看一下以下测试:
1.原表记录
SQL> select count(*) from test;
COUNT(*)
----------
5
2.误删除所有记录,并且提交更改。
SQL> delete test;
5 rows deleted.
SQL> commit;
Commit complete.
SQL> select count(*) from test;
COUNT(*)
----------
0
3.获得当前SCN
如果能够确切知道删除之前SCN最好,如果不知道,可以进行闪回查询尝试.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1338692
SQL> select count(*) from test as of scn 1338660;
COUNT(*)
----------
5
我们看到在SCN=1338760时,数据都在。
4.恢复数据.
SQL> insert into emp3 select * from emp3 as of scn 1338660;
14 rows created.
SQL> commit;
Commit complete.
总结:如果回滚段被覆盖,则无法进行闪回查询恢复。
=======================================================
二、Oracle10g flashback database
以下的例子演示了命令行配置。这也可以用企业治理器来完成。
在我们配置重现数据库之前,我们需要照顾以下一些先决条件。
Flash Recovery Area
首先,我们需要配置一个Flash Recovery Area (FRA)。在Oracle10g中,这是个新东西,FRA只不过是一个恢复相关文件的磁盘定位。对于重现数据库,一个新的后台进程,名为Recovery Writer (RVWR),在来自SGA的数据库重现缓存的映像之前,阶段性地写入磁盘,作为FRA中的重现日志。重现日志是在FRA中由Oracle数据库自动治理的。
重现日志的成本是以空间和性能来衡量的。空间是数据库写密度的一个因素。一个24小时运行的,以5%的数据块写入作为重现日志的方式必然会导致磁盘整体空间的5%的增长。因为块是以规律的间隔写入的,而不是事务的一部分,所以对性能的影响是可以忽略不计的。
1、要配置FRA,需要设置如下的初始化参数:
alter system set db_recovery_file_dest='/oracle/flash_recovery_area' scope=both;
alter system set db_recovery_file_dest_size = 10G scope=both;
2、接下来,我们需要配置归档。再一次,我们需要使用FRA作为我们的归档日志目的地。与传统恢复类似,重现数据库需要归档以向前恢复提交的事务,在重现日志重新存储了希望时间之前的时点之后。
要最小化配置归档,执行如下的命令,按照顺序:
SQL> startup mount
ORACLE instance started.
Database mounted.
SQL> alter database archivelog;
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 2
Next log sequence to archive 4
Current log sequence 4
3、启用重现数据库
配置了这些先决条件之后,我们预备好配置重现数据库了。
首先,我们需要设置重现保持目标。这个初始化参数,以分钟来计算,代表我们可以把数据库返回到多长时间之前。它的值决定了FRA中重现日志的数量和时间段。下面我们的例子将其设置为24小时。要理解这个保持时间段并不是保证是非常重要的。假如FRA需要空间,重现日志将会自动删除目标保持时间点之前的记录。稍后我们会看到,我们保证重现日志的方式在FRA中进行维护。有了保持时间段设置,重现数据库可以激活。
在mount状态下执行如下命令,设置重现保持目标为24小时:
SQL> alter system set db_flashback_retention_target = 1440 scope=both;
System altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
4、监控FRA
SQL>select name,space_limit,space_used, space_reclaimable from v$recovery_file_dest;
5、判定数据库的可重现的时间点
在Oracle10g R1中,你有两种选择来捕捉你的数据库的PIT:时间戳和系统修改号码(SCN)。这个信息是作为重现操作的一部分要求的。 捕捉到提交的SCN或者稍后的非常重要,而不是数据治理语言操作。Oracle提供了一种比较笨拙的方式来捕捉提交的SCN,通过userenv('commitscn')函数。我们的示例在发生损坏的数据治理语言操作之前捕捉到了这个信息。
select current_scn from v$database;
CURRENT_SCN
-----------
1321065
or
select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')
"Recover Time" from v$database;
Recover Time
-------------------
2006-09-23:20:13:48
在1Oracle10g R2中,Oracle通过重新存储点简化了这个过程。一个重新存储点就是一个用户定义的与数据库PIT相关连的名字,可以在时间戳或者SCN中使用。可以认为重新存储点是一个redo历史的参考标记。重新存储点保留在控制文件中,直到重新存储点被删除或者重现日志被删除。第二个例子保证了重现数据库对于恢复是可用的。
create restore point my_restore_point;
Operation 206 succeeded.
guarantee flsashback database;(可选)
注意:重新存储点并不会保证所有的事务都在那个时间点上提交
6、模拟数据库损坏
模拟数据库损坏
insert into my_table values (2);
1 row created.
commit;
提交完成
判定数据库是否由于人为错误导致逻辑损坏。
select c1, ora_rowscn from my_table;
C1 ORA_ROWSCN
---------- ----------
1 1320954
2 1321231
注意:在默认情况下,Oracle在时钟级别上检索SCN。当然,时钟当中的所有行都有一样的SCN。激活行级别的SCN检索,可以在CREATE TABLE命令中使用ROWDEPENDENCIES要害字。
比如:CREATE TABLE MY_TABLE (C1 NUMBER) ROWDEPENDENCIES;
7、检验重现数据库是可能的。
判定你可以重现的最早的时间。
SELECT OLDEST_FLASHBACK_SCN
,to_char(OLDEST_FLASHBACK_TIME,'YYYY-MM-DD:HH24:MI:SS')
"OLDEST_FLASHBACK_TIME"
FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1319629 2006-09-23:19:51:56
判定你是否有重新存储点。
select name, scn, time from v$restore_point;
NAME SCN TIME
---------------- ---------- ----------------------------
MY_RESTORE_POINT 1321136 23-SEP-06 08.16.24.000000000 PM
8、使用先前创建的重新存储点来重现数据库。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Database mounted.
SQL> flashback database to restore point my_restore_point; #flashback database to timestamp sysdate-15/1440; (当前的系统时间之前的15分钟)
Flashback complete.
在警告日志中检查重现数据库消息
.
.
.
Sat Sep 23 20:38:11 2006
flashback database to restore point my_restore_point
Sat Sep 23 20:38:12 2006
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
parallel recovery started with 2 processes
Sat Sep 23 20:38:14 2006
Recovery of Online Redo Log: Thread 1 Group 2 Seq 33 Reading mem 0
Mem# 0 errs 0:
C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
Sat Sep 23 20:38:16 2006
Incomplete Recovery applied until change 1321137
Flashback Media Recovery Complete
Completed: flashback database to restore point my_restore_point
验证你的数据库恢复到你想要的状态
假如你不满足,你可以再次重现,把数据库向前恢复,直到或者执行了完全恢复:recover database.
9、只读方式打开数据库(如果以resetlogs打开数据库,那么就无法进行完全恢复了),检查数据是否正确。
SQL> alter database open read only;
Database altered.
SQL> select c1, ora_rowscn from my_table;
C1 ORA_ROWSCN
---------- ----------
1 1321002
10、可以重新完全恢复后打开数据库。进行正常的应用:
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP MOUNT;
SQL>RECOVER DATABASE;
SQL>ALTER DATABASE OPEN;
注意:这时候的数据库还是原来正常的数据库。
结论:
重现数据库将会成为DBA最喜欢的Oracle10g特性之一。无论你是否纠正了用户的错误,只是看看先前的数据库状态,或者在衰退测试之后回到测试环境中,这个特性都是减少恢复时间的最好策略。我们看到这项技术很轻易使用,比传统的恢复更快,并且最好的是,它是免费的!我希望你也会认为重现数据库是可用性体系结构中的一项主要组件。
注意:为了不丢失数据,可以先用flashback恢复到以前的某个restore点(类似于时间点恢复),然后只读方式打开数据库,把表给导出来,然后再回到mount状态,重新做完全恢复,正常打开数据库,把表导入。
===================================
三、10g的flashback recyclebin特性
对被drop表的管理
1、查看当前回收站被删除的表
Show recyclebin
2、查看被删除表的内容:
Select * from “RECYCLEBIN NAME”;
3、恢复被drop的表
Flashback table table_name to before drop;
Flashback table table_name to before drop rename to new_name;
4、清空回收站
Purge table “RECYCLEBIN NAME”;
Purge tablespace tablespace_name;
清空所有的回收站(需要sysdba权限)