flashback query 是oracle 9i 之后推出来的一个特性,借助它,我们有可能很方便的恢复误操作(dml 操作)之前的数据。
简单的说,flashback query 允许你查看过去某个时间点的数据,比如说,你可以查看5分钟,或一个小时之前的某个表的数据。这样的话,通过过去数据和现在实际数据的对比,我们就可以很容易的得到误操作所影响到的数据。
flashback 闪回是要用到 undo 的,因此,关于undo_retention 参数的设置和 flashback query 特性是有关系的。
undo_retention 基本上(10g 有特性保证绝对保证) 保证了受dml 影响的数据前影像在undo segment 中至少保留多长时间,那么这个时间保留的越长,允许你flashback query 至过去时刻的范围就越大。undo_retention 要适当设置。
不多说了,看例子。
总的来说,有两个2,第一个2 是说, flashback query 的特性可以使用scn 或者timestamp 来 指定要闪回的时间点;第二个2 是说,flashback query 有两种形式的用法,一种是 select 后面的 as of , 一种是 通过 dbms_flashback 包的 enable_at_time 或者 enable _at_system_change_number 来指定过去的时间点。
SQL> desc test
名称 是否为空? 类型
----------------------------------------- -------- -------------------------
ID NUMBER
SQL> set time on
23:07:24 SQL> select * from test;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:07:29 SQL> delete from test;
已删除11行。
23:07:53 SQL> commit;
提交完成。
23:08:00 SQL> select * from test;
未选定行
23:08:03 SQL> select * from test as of timestamp (sysdate - 1/1440); -- 查看一分钟之前的数据
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:08:28 SQL> select dbms_flashback.get_system_change_number from dual; --获得当前的scn 号
GET_SYSTEM_CHANGE_NUMBER
------------------------
699693
23:08:52 SQL> select * from test as of scn 699690;
未选定行
23:09:05 SQL> select * from test as of scn 699666;
未选定行
23:09:14 SQL> select * from test as of scn 699600;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:09:23 SQL>
-- 可以从如下的语句中大致判断下 scn 是在什么时间范围
SQL> select sequence#,first_change#,next_change#,to_char(first_time,'YYYYMMDD HH24:MI:SS') FROM v$log_history;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# TO_CHAR(FIRST_TIME,'YYYYMMDDHH
---------- ------------- ------------ ------------------------------
1 534907 565899 20080411 23:19:27
2 565899 573451 20080411 23:23:10
3 573451 612334 20080411 23:28:57
4 612334 639840 20040101 00:07:31
5 639840 661519 20080413 10:00:18
6 661519 688384 20080413 21:44:24
6 rows selected
SQL>
-- 下面是 dbms_flashback 包的方式
23:16:52 SQL> connect dbmgr
输入口令:
已连接。
23:17:00 SQL> exec dbms_flashback.enable_at_time(sysdate-20/1440);
PL/SQL 过程已成功完成。
23:17:21 SQL> select * from sys.test;
ID
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
23:17:32 SQL> exec dbms_flashback.disable;
PL/SQL 过程已成功完成。
23:17:43 SQL> select * from sys.test;
未选定行[@more@]
简单的说,flashback query 允许你查看过去某个时间点的数据,比如说,你可以查看5分钟,或一个小时之前的某个表的数据。这样的话,通过过去数据和现在实际数据的对比,我们就可以很容易的得到误操作所影响到的数据。
flashback 闪回是要用到 undo 的,因此,关于undo_retention 参数的设置和 flashback query 特性是有关系的。
undo_retention 基本上(10g 有特性保证绝对保证) 保证了受dml 影响的数据前影像在undo segment 中至少保留多长时间,那么这个时间保留的越长,允许你flashback query 至过去时刻的范围就越大。undo_retention 要适当设置。
不多说了,看例子。
总的来说,有两个2,第一个2 是说, flashback query 的特性可以使用scn 或者timestamp 来 指定要闪回的时间点;第二个2 是说,flashback query 有两种形式的用法,一种是 select 后面的 as of , 一种是 通过 dbms_flashback 包的 enable_at_time 或者 enable _at_system_change_number 来指定过去的时间点。
SQL> desc test
名称 是否为空? 类型
----------------------------------------- -------- -------------------------
ID NUMBER
SQL> set time on
23:07:24 SQL> select * from test;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:07:29 SQL> delete from test;
已删除11行。
23:07:53 SQL> commit;
提交完成。
23:08:00 SQL> select * from test;
未选定行
23:08:03 SQL> select * from test as of timestamp (sysdate - 1/1440); -- 查看一分钟之前的数据
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:08:28 SQL> select dbms_flashback.get_system_change_number from dual; --获得当前的scn 号
GET_SYSTEM_CHANGE_NUMBER
------------------------
699693
23:08:52 SQL> select * from test as of scn 699690;
未选定行
23:09:05 SQL> select * from test as of scn 699666;
未选定行
23:09:14 SQL> select * from test as of scn 699600;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:09:23 SQL>
-- 可以从如下的语句中大致判断下 scn 是在什么时间范围
SQL> select sequence#,first_change#,next_change#,to_char(first_time,'YYYYMMDD HH24:MI:SS') FROM v$log_history;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# TO_CHAR(FIRST_TIME,'YYYYMMDDHH
---------- ------------- ------------ ------------------------------
1 534907 565899 20080411 23:19:27
2 565899 573451 20080411 23:23:10
3 573451 612334 20080411 23:28:57
4 612334 639840 20040101 00:07:31
5 639840 661519 20080413 10:00:18
6 661519 688384 20080413 21:44:24
6 rows selected
SQL>
-- 下面是 dbms_flashback 包的方式
23:16:52 SQL> connect dbmgr
输入口令:
已连接。
23:17:00 SQL> exec dbms_flashback.enable_at_time(sysdate-20/1440);
PL/SQL 过程已成功完成。
23:17:21 SQL> select * from sys.test;
ID
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
23:17:32 SQL> exec dbms_flashback.disable;
PL/SQL 过程已成功完成。
23:17:43 SQL> select * from sys.test;
未选定行[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7316690/viewspace-1020593/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7316690/viewspace-1020593/