在介绍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;

 
来自:https://www.cnblogs.com/hqbhonker/p/3977200.html
http://www.cnblogs.com/lanzi/archive/2010/12/22/1913769.html

FLASHBACK介绍的更多相关文章

  1. 《转》oracle—flashback

    FLASHBACK介绍 在介绍flashback之前先介绍下undo_retention相关参数 undo_retention:表示undo数据的过期时间.系统默认这个时间设置为900即15分钟.但要 ...

  2. MySQL Flashback 工具介绍

    MySQL Flashback 工具介绍 DML Flashback 独立工具,通过伪装成slave拉取binlog来进行处理 MyFlash 「大众点点评」 binlog2sql 「大众点评(上海) ...

  3. flashback database 基本介绍一

    flashback database 整个架构包括一个进程recover writer (rvwr)后台进程,flashback database log 日志和flash recovery area ...

  4. 【转】FlashBack总结之闪回查询与闪回表

    本文主要介绍利用UNDO表空间的闪回技术,主要包括:闪回表,闪回版本查询,闪回事务查询,闪回查询.这些闪回技术实现从回滚段中读取表中一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错 ...

  5. oracle的回收站介绍

    昨天做的展示oracle表空间功能剩余空间的功能,发现查询表dba_free_space时特别慢,经网上搜索,说是由于表空间碎片和回收站(Oracle 10g以后才有)引起的,后来搜到一片介绍回收站的 ...

  6. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  7. 基于OGG的Oracle与Hadoop集群准实时同步介绍

    版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/220 来源:腾云阁 https://www.qclou ...

  8. flashback data archive (转)

    闪回数据归档(Flashback Data Archive) 在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档 ...

  9. Oracle asm介绍和安装linux+oracle10g+asm过程

    Oracle asm介绍和安装linux5.2+oracle10g+asm过程   1)ASM(自动存储管理)的来由:   ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来 ...

随机推荐

  1. Windows上安装配置SSH教程(5)——win10下使用Cygwin+Expect自动登陆ssh

    1.安装Cygwin,安装上Tcl和Expect两个工具. 可以使用apt-cyg命令安装,也可以在安装Cygwin的时候选中这两个包. 命令安装的话使用下面的两个命令: apt-cyg instal ...

  2. Ubuntu下安装mysql与mysql workbench

    Ubuntu 安装jdk:[链接] Ubuntu安装eclipse:[链接] Ubuntu下安装MySQL与mysql workbench:[链接] Ubuntu配置tomcat9:[链接] 1.su ...

  3. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

  4. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  5. Eclipse Debug调试遇到的问题

    在使用Debug模式前,一定要先打好断点.快捷调试方法:   在使用过程中,可以只保留Console,Variables,Debug窗口,把其他无用的窗口最小化掉,或者删掉即可.如果要恢复删掉的试图, ...

  6. Java连接redis

    一.依赖包 jedis-2.1.0.jar   commons-pool-1.6.jar 二.实例 //连接参数public class RedisConfig { public static int ...

  7. python接口自动化(十四)--session关联接口(详解)

    简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...

  8. ElasticSearch入门 附.Net Core例子

    1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...

  9. C#处理json实战

    昨天看到技术群中发了一个查询天气的api,http://www.sojson.com/open/api/weather/json.shtml?city=南昌 点进去看,发现服务器传回来一个天气信息的j ...

  10. 设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...