在介绍flashback之前先介绍下undo_retention相关参数

undo_retention:表示undo数据的过期时间。系统默认这个时间设置为900即15分钟。但要注意,保证undo数据在这个时间内有效的前提是undo表空间有

足够的空间存储。如果undo空间已满且又有新事务执行则会覆盖原来的undo数据而不管undo数据是否过期。不过,如果undo空间足够,

尽管undo数据已经   过了指定的时间,只要不被覆盖,该undo数据还是存在,因此也还是能够被执行flashback闪回(但是必须在增删改

表记录之前先执行alter table table_name enable row movement即允许该表进行行移动,否则过了指定的时间该undo数据尽管没被

覆盖也会无法闪回了,会提示ora-01466错误)。

如果想确保undo数据有效期为undo_retention指定的时间,可以通过 为undo表空间指定Retention Guarantee,如下:

Alter tablespace undotbs1 retention guarantee;(禁止的话执行:Alter tablespace undotbs1 retention noguarantee;)这样就可以保证undo表空间尽管已经满了,有新事务出现也不会去覆盖未过期的undo数据。当然此时的新事务执行就要卡住了。

具体参考http://blog.itpub.net/post/602/469270

一、FLASHBACK QUERY 介绍

创建表并插入数据     
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');

删除数据
DELETE FROM flashback_test WHERE a='d1';
--基于TIMESTAMP时间的返回查询
SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 15/1440;
提示ORA-01466:无法读取数据-表定义已更改
但是没有做过表修改啊,奇怪了
DELETE FROM flashback_test WHERE a='d2';
SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 10/1440;
1    d2    sw    sf
2    d3    swd    ss
但是第一条记录找不回来了,看来返回查询只能在一定时间内,超过了该时间就无法查询了。

--基于SCN的返回查询

查询某个时刻的scn
SQL> select timestamp_to_scn(to_date('20100105160606','yyyy-mm-dd hh24:mi:ss')) from dual;
查看scn
select dbms_flashback.get_system_change_number from dual;
select current_scn from v$database;

GRANT EXECUTE ON dbms_flashback TO fyzh_ora;--授权一般用户可执行dbms_flashback包
SELECT dbms_flashback.get_system_change_number FROM dual;--查看当前的SCN
SELECT *FROM flashback_test AS OF SCN 12486407805791; 
1    d3    swd    ss

FLASHBACK TABLE只是针对表的增删改操作进行闪回

通过如下语句可以准确的获取当前的时间点
SQL>  variable scn number;
SQL>  exec :scn:=dbms_flashback.get_system_change_number (scn为3373273)
select count(1) from t;--20000条记录
delete from t;
select count(1) from t;--现在只有0条记录

select count(1) from t as of scn :scn;查找在删之前的某个时间点,数据仍是20000条

现在将表闪回到3373273这个点
flashback table t to scn:scn;
提示“ORA-08189: 因为未启用行移动功能, 不能闪回表”错误,执行如下语句
alter table t enable row movement;--允许对行rowid进行移动

再进行闪回
flashback table t to scn:scn;

此时再查询该表
select count(1) from t;恢复了20000条记录。

我们也可以通过flashback_transaction_query这个视图中获取想要闪回的时间点。

--TRUNCATE TABLE 操作的闪回实验
TRUNCATE TABLE flashback_test;
SELECT * FROM flashback_transaction_query WHERE table_name='FLASHBACK_TEST';
FLASHBACK TABLE flashback_test TO SCN 12486407806290;
提示ORA-01466:无法读取数据-表定义已更改
说明:ddl操作不会记录到flashback_transaction_query视图中,且也不能执行闪回
创建表并插入数据     
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss'); 
1.删除表
--删除表
DROP TABLE flashback_test;
--查看回收站,该表存在回收站中
SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';
--执行闪回
FLASHBACK TABLE flashback_test TO BEFORE DROP;
--执行闪回后,该表已不在回收站,在查看该表已经恢复
SELECT * FROM flashback_test;

2.删除表且执行purge操作
--删除表
DROP TABLE flashback_test PURGE;
--查看回收站,发现没有在回收站中
SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';

3.清除回收站
PURGE TABLE original_name;--清除回收站中的某个表
PURGE INDEX original_name;--清除回收站中的某个索引
PURGE RECYCLEBIN;--清除自己用户下的回收站信息
PURGE TABLESPACE tablespace_name;--清除指定表空间下所有在回收站的对象
PURGE TABLESPACE tablespace_name USER user_name;--清除指定表空间指定用户下在回收站中的对象(drop user 若加上CASCADE关键字则不进入回收站)
PURGE DBA_RECYCLEBIN; --从所有用户的回收站清除所有对象

注:如果被删除的表不在回收站,则执行flashback drop table时会提示ORA-38305:对象不在回收站中。

不同版本查询介绍
VERSIONS  BETWEEN 能够查看指定时间段内undo表空间中记录的不同版本
1.创建表
CREATE TABLE ff (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
2.分别作插入,更新,删除操作
INSERT INTO ff VALUES('d1','s','s');
UPDATE ff SET a='u_d2' WHERE a='d1';
DELETE FROM ff WHERE a='d1';
3.查看 该时间内ff表非操作情况
1)VERSIONS BETWEEN TIMESTAMP minvalue AND MAXVALUE 方式
SELECT versions_starttime,
       versions_endtime,
       versions_xid,
       versions_operation,
       a,
       b,
       c
  FROM ff VERSIONS BETWEEN TIMESTAMP minvalue AND maxvalue
 ORDER BY versions_starttime;
VERSIONS_STARTTIME         VERSIONS_ENDTIME             VERSIONS_XID     VERSIONS_OPERATION       A     B    C
------------------------  ---------------------------- ----------------   ------------------    ----- ----- ----
30-12月-11 01.27.57 下午   30-12月-11 01.28.36 下午    0900000035070000         I                d1     s    s
30-12月-11 01.28.36 下午                               0100140069060000         U                u_d1   s    s

2)VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss')
SELECT versions_starttime,
       versions_endtime,
       versions_xid,
       versions_operation,
       a,
       b,
       c
  FROM ff VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss');

3)VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864
SELECT *FROM flashback_transaction_query WHERE table_name='FF';
SELECT versions_starttime,
       versions_endtime,
       versions_xid,
       versions_operation,
       a,
       b,
       c
  FROM ff VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864;

GRANT SELECT ON flashback_transaction_query TO fyzh_ora;--直接赋予该表的select权限还是无法查询,提示权限不够
GRANT SELECT ANY TRANSACTION TO fyzh_ora;--必须授予ANY TRANSACTION才行

--创建表flashback_test
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
--插入三条记录
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
--执行删除操作
DELETE FROM flashback_test WHERE a='d1';
--通过版本查询xid,在flashback_transaction_query视图中找出flashback_test表对应删除操作的undo_sql,执行该sql即可闪回 

SELECT xid, operation, table_name, undo_sql
  FROM flashback_transaction_query
 WHERE xid IN
       (SELECT versions_xid

FROM flashback_test versions BETWEEN TIMESTAMP minvalue AND maxvalue);

查询结果如下图所示:

SQL> show parameter retention guarantee;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
undo_retention                       integer     900

1.创建表并插入数据     
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
DELETE FROM flashback_test WHERE a= 'd1';
2.FLASHBACK DATABASE 
1)一般用户下执行:
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-01031: 权限不足
2)采用sys用户执行:
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24); 
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-38757: 要闪回数据库, 数据库必须已装载但不能打开。
3)关闭数据库并装载数据库
C:\Users\thinkpad>sqlplus/nolog
SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:05:16 2011
Copyright (c) 1982, 2008, Oracle.  All rights reserved.
SQL> conn sys/fyzh@fgisdb as SYSDBA --sys用户登录
已连接。
SQL> SHUTDOWN IMMEDIATE;--关闭数据库
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup MOUNT;--装载数据库,无法识别监听,退出重新以sys登录可解决
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开

C:\Users\thinkpad>sqlplus/nolog
SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:06:19 2011
Copyright (c) 1982, 2008, Oracle.  All rights reserved.
SQL> conn sys/fyzh as SYSDBA --再次登录
已连接到空闲例程。
SQL> startup mount; --装载数据库
ORACLE 例程已经启动。

Total System Global Area  535662592 bytes
Fixed Size                  1348508 bytes
Variable Size             251661412 bytes
Database Buffers          276824064 bytes
Redo Buffers                5828608 bytes
数据库装载完毕。

4)再次执行还是报错
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-38726: 未启用闪回数据库事件记录。
SQL> flashback database to restore point BEFORE_DROP;
flashback database to restore point BEFORE_DROP 
ORA-38780: 还原点 'BEFORE_DROP' 不存在。

5)开启闪回功能
SQL> alter database flashback on;
alter database flashback on
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38707: 尚未启用介质恢复。

6)开启归档和闪回
SQL> alter database archivelog;
Database altered
SQL> alter database flashback on;
Database altered

7)再次执行
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24)
ORA-38729: 执行 FLASHBACK 的闪回数据库日志数据不足。
 
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.01/24);
Done

8)开启数据库
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open noresetlogs;
alter database open noresetlogs
*
第 1 行出现错误:
ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成

SQL> alter database open resetlogs;
数据库已更改。

9)查看 表还存在,数据2条

注:1.必须具有DBA权限
    2.数据库必须处在装载状态
    3.必须启用介质恢复
    4.必须开启闪回和归档(必须在归档模式下才能开启闪回)
    5.闪回好后,开启数据库要使用 RESETLOGS 或 NORESETLOGS 选项
    6.使用该功能,需要之前就已经开启归档模式和闪回,否则等数据损坏再打开已经来不及了

复原点是手动创建的一个时间点,数据库可以闪回到创建的该复原点。
普通复原点:只是在闪回或恢复操作中为指定以前的SCN或时间点提供方便。但不保证数据库在所有情形下都保留成功执行
            闪回数据库操作所需的闪回数据库日志。
创建普通复原点:CREATE RESTORE POINT test_point;
有保证的复原点:保证可以把数据库倒退到由复原点指定的SCN或时间点.
创建有保证的复原点:CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
删除复原点:DROP RESTORE POINT point_name;
查看复原点:v$restore_point视图

创建复原点注意事项:
1.创建复原点必须打开归档模式
2.创建复原点可以不打开闪回
3.创建复原点若闪回没打开数据库需为装载状态
SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE
第 1 行出现错误:
ORA-38784: 无法创建还原点 'TEST_STOREPOINT'。
ORA-38787: 在闪回数据库处于关闭状态时, 创建第一个可靠还原点需要装载模式。
4.创建了复原点后,数据库的闪回由原来的no状态变成了RESTORE POINT ONLY
SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
还原点已创建。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY

利用复原点闪回数据库:
FLASHBACK DATABASE TO RESTORE POINT test_storepoint;

《转》oracle—flashback的更多相关文章

  1. Oracle Flashback Technologies - 闪回查询

    Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...

  2. Oracle Flashback Technologies - 闪回被drop的表

    Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...

  3. Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量

    Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量 v$flashback_database_stat监控闪回数据的i/o开销的统计信息,根据之前的系统负载 ...

  4. Oracle Flashback Technologies - 闪回数据库

    Oracle Flashback Technologies - 闪回数据库 根据指定的SCN,使用rman闪回数据库 #查看可以闪回到多久前 SQL> select * from v$flash ...

  5. Oracle Flashback Technologies (总)

    Oracle Flashback Technologies Oracle 9i中增加了闪回查询技术,闪回查询为数据库提供了一种简单.强大.完全无干扰从人为错误中恢复的机制.通过闪回查询,用户可以查看过 ...

  6. oracle flashback

    一.Flashback闪回技术概述:当Oracle数据库发生逻辑错误时,必须使用flashback技术,实现快速和方便的恢复数据.对于人为错误,要确定受到错误事务影响的对象或者记录是非常困难的.使用f ...

  7. ORACLE FLASHBACK DATABASE 知识整理

    1.知识储备 1)    只有SYSDBA有权执行,闪回前一定要记录当前SCN 2)    需要停机,并要求处于ARCHIVELOG模式中 3)    闪回日志不能被复用和归档,是自动管理的.RVWR ...

  8. Oracle Flashback 详解

    Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...

  9. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  10. oracle flashback 后主键及索引更改问题

    oracle flashback 后 主键会变为bin开头,如果删除可以采用将sql复制出单独窗口,然后加上“”执行

随机推荐

  1. 【枚举】【高斯消元】Gym - 101412D - Find the Outlier

    给你一个未知的d次多项式在0,1,...,d+2处的取值,其中有且只有一个是错的,问你哪个是错的. 枚举哪个是错的,再在剩下的d+2个中取d+1个高斯消元,解出多项式系数,然后代一下最后剩下的那个数看 ...

  2. 【带权并查集】【离散化】vijos P1112 小胖的奇偶

    每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...

  3. 【MySQL笔记】用户管理

    1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...

  4. ElasticSearch安装为Windows服务

    目前我都是在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch 这样直接启动的话集 ...

  5. 使用hosts.allow和hosts.deny实现简单的防火墙

    说明:我建议学习防火墙只单一学习一种就够了,这种方式虽然简单和快速,但也有些不太灵活,所以如果要深入防火墙建议转iptables  一.背景简介 在Linux上多用iptables来限制ssh和tel ...

  6. 最佳实践: 勿在 Servlet 中实现 SingleThreadModel

    摘要 请不要实现 SingleThreadModel 接口.这种实践将导致 Web 容器创建多个 servlet 实例:即为每个用户创建一个实例.对于任何大小的应用程序,这种实践都将导致严重的性能问题 ...

  7. linux下的udev是干嘛的,能否说的通俗点

    转:http://www.360doc.com/content/11/0415/21/1317564_109924863.shtml 早期的linux的/dev目录下有一大堆设备文件,不管你的主机上是 ...

  8. express-session的简单使用说明

    我们知道Internet 通过协议分为stateful和stateless两类,而http是stateless协议,客户端发送请求到服务端建立一个连接,请求得到响应后连接即中断,服务器端不会记录状态, ...

  9. 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)

    本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...

  10. 【RocketMQ】【分布式事务】使用RocketMQ实现分布式事务

    参考地址:https://blog.csdn.net/zyw23zyw23/article/details/79070044 视频地址:https://v.youku.com/v_show/id_XO ...