Oracle Flashback之Flashback database(二)

2014-11-24 08:58:36 · 作者: · 浏览: 4
据库
SQL>alter database open;

Flashback Database操作示例

1. 检查是否启动了flash recovery area:
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\product\10.2.0\flash _recovery_area\
db_recovery_file_dest_size big integer 2G
2. 检查是否启用了归档
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
3. 检查是否启用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES

在恢复点之前的数据库的数据:test1表和test2表各有一条数据如下
SQL> select * from test1;
ID NAME
---------- ----------
3759479 A

SQL> select * from test2;
ID VAL
---------- ----------
3759479 A

这里3759479 是一个scn的值,用这个值好形象的说明表示这些数据是在恢复点之前的数据.

4. 查询当前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
3761875
5. 查询当前的时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
12-01-13 15:26:34

到时候做恢复的时候只恢复到上面的点.

6. 在恢复点后的操作:
一个用户不小心将test1表里的数据删除了而且提交了,想找回来.
SQL> delete from test1;
1 row deleted.
SQL> commit;
Commit complete.
同时,另一个用户在test2表里增加了数据.
SQL> insert into test2 values(dbms_flashback.get_system_change_number,'B');
1 row created.
SQL> commit;
Commit complete.

SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
3761885 B

7. Flashback Database 实际是对数据库的一个不完全恢复操作,因此需要关闭数据库重启到mount状态。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 213912452 bytes
Database Buffers 390070272 bytes
Redo Buffers 7135232 bytes
Database mounted.

8. 执行恢复:分timestamp 或者SCN两种
SQL> Flashback database to scn 3761875;

Flashback complete.
通过时间点闪回: Flashback database to timestamp to_timestamp('12-01-13 15:26:34','yy-mm-dd hh24:mi:ss');

9. 打开数据库:

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

SQL> alter database open read only;
Database altered.
SQL> select * from test1;
ID NAME
---------- ----------
3759479 A

对于test1表,这里我们发现恢复点之前的数据已经闪回.这时候应该将闪回的test1表的数据导出,对数据库做完整的恢复,然后将数据导入.
SQL> select * from test2;
ID NAME
---------- ----------
3759479 A
对于test2表,这里我们发现恢复点之前的数据也存在,但是恢复点之后的数据(3761885 B)丢失了.

SQL> shutdown immediate
SQL> startup mount
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.

再来验证数据:
SQL> select * from test1;
no rows selected
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
3761885 B

是完整恢复后的正确数据,把开始test1表的导出数据导入test1表,数据找回完成.
和Flashback Database 相关的2个视图:
1. V$database
这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
2. V$flashback_datab