求教闪回用法!!! http://blog.csdn.net/emag_oracle/archive/2005/02/01/276707.aspx 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用select语句的flash back子句。很简单的。 我把piner的帖子贴一下:1、创建FLASH用户SQL> create user flash identified by flash; SQL> grant connect, resource to flash; SQL> grant execute on dbms_flashback to flash; SQL> connect flash/flash 2、创建一个测试表 SQL> CREATE TABLE tst(t number(5)); Table created. SQL> INSERT INTO tst VALUES(1); 1 row created. SQL> INSERT INTO tst VALUES(2); 1 row created. SQL> COMMIT; Commit complete. SQL> CREATE TABLE keep_date (date_scn_tracking date); Table created. SQL> SELECT * FROM tst; T ---------- 1 2 注意:在执行步骤3或者步骤4之前,等待5分钟。3. 删除记录SQL> execute dbms_flashback.disable; PL/SQL procedure successfully completed. SQL> INSERT INTO keep_date select sysdate from dual; 1 row created. SQL> COMMIT; Commit complete. SQL> DELETE FROM tst WHERE t = 1; 1 row deleted. SQL> COMMIT; Commit complete. SQL> SELECT * FROM tst; T ---------- 2 通过以上的操作,我们插入了两条记录,并删除了其中一条记录,现在的结果是,我们这里只有一条记录了。在以下的操作中,我们将通过flashback query找到删除的记录4. 闪回查询 SQL> declare 2 restore_scn date; 3 begin 4 select date_scn_tracking into restore_scn from keep_date; 5 dbms_flashback.enable_at_time(restore_scn); 6 end; 7 / PL/SQL procedure successfully completed. SQL> SELECT * FROM tst; T ---------- 1 2 可以看到,虽然我们删除记录并提交了,但是通过特定操作,我们还能查询到删除前的两条记录,这里需要特别注意的是,Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间,关于获取SCN,我们可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER或者LOGMNR。如DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUM); 来定位你的恢复时间点,下面是使用方法:SQL> VARIABLE SCN_SAVE NUMBER;SQL>EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;PL/SQL procedure successfully completed.SQL> print SCN_SAVE;SCN_SAVE----------2.1202E+11SQL>execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);最后注意,Oracle 9i的Flashback有如下限制。·采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。·不能flashback5天以前的数据,这个并不是undo_retention所能决定的。·闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。·由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保证能成功·对于drop,truncate等不记录回滚的操作,flashback是无能为力的。 不需要那么复杂。SELECT * FROM table AS OF TIMESTAMP (to_timestamp('20051108 08:00:33','yyyymmdd hh24:mi:ss')); 菜鸟 ORACLE 启动报错 在线求助 请教一个发放奖励的存储过程。 oracle sql 数据同步 优化sql 菜鸟 求助~!oracle 怎么能让insert into test values('111'); 执行100遍? 数据库过滤部分数据 关于索引表空间 怎么不区分全角/半角 初学pro*c,遇到i386ld fatal: Symbol referencing errors. No output written to a.out问题 Oracle 数据库应用变慢怎么解决!!!急!!! 触发器的设计? oralce10g安装问题.
SQL> create user flash identified by flash;
SQL> grant connect, resource to flash;
SQL> grant execute on dbms_flashback to flash;
SQL> connect flash/flash
2、创建一个测试表
SQL> CREATE TABLE tst(t number(5));
Table created.
SQL> INSERT INTO tst VALUES(1);
1 row created.
SQL> INSERT INTO tst VALUES(2);
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE keep_date (date_scn_tracking date);
Table created.
SQL> SELECT * FROM tst;
T
----------
1
2
注意:在执行步骤3或者步骤4之前,等待5分钟。
3. 删除记录
SQL> execute dbms_flashback.disable;
PL/SQL procedure successfully completed.
SQL> INSERT INTO keep_date select sysdate from dual;
1 row created.
SQL> COMMIT;
Commit complete.
SQL> DELETE FROM tst WHERE t = 1;
1 row deleted.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM tst;
T
----------
2
通过以上的操作,我们插入了两条记录,并删除了其中一条记录,现在的结果是,我们这里只有一条记录了。在以下的操作中,我们将通过flashback query找到删除的记录
4. 闪回查询
SQL> declare
2 restore_scn date;
3 begin
4 select date_scn_tracking into restore_scn from keep_date;
5 dbms_flashback.enable_at_time(restore_scn);
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM tst;
T
----------
1
2
可以看到,虽然我们删除记录并提交了,但是通过特定操作,我们还能查询到删除前的两条记录,
这里需要特别注意的是,Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间,关于获取SCN,我们可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER或者LOGMNR。如
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUM);
来定位你的恢复时间点,下面是使用方法:
SQL> VARIABLE SCN_SAVE NUMBER;
SQL>EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
PL/SQL procedure successfully completed.SQL> print SCN_SAVE;
SCN_SAVE
----------
2.1202E+11SQL>execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);最后注意,Oracle 9i的Flashback有如下限制。
·采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。
·不能flashback5天以前的数据,这个并不是undo_retention所能决定的。
·闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
·由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保证能成功
·对于drop,truncate等不记录回滚的操作,flashback是无能为力的。
SELECT * FROM table AS OF TIMESTAMP (to_timestamp('20051108 08:00:33','yyyymmdd hh24:mi:ss'));