SlideShare a Scribd company logo
Flashback
Overview
• oracle数据库闪回技术主要使用于纠正用户错
  误, 比如错误地提交了事务, 在某些时候闪回还
  可以替代传统的数据库恢复操作. 本章将介绍
  闪回技术的以下方面:
 – 从回收站中还原已删除的表
 – 闪回查询(flashback query)
 – 闪回事务(flashback transaction)
 – 闪回表相关的操作(flashback table operations)
 – 数据库闪回
 – 设置和使用闪回数据的归档
Flashback types
• 共有四种闪回技术, 可以应用在不同的方面, 在功能上它们存在一定的交集.
  分别简述如下:
  – flashback database
  数据库闪回对数据库进行回滚, 最终将数据库还原至某一个过去的时间点, 此时必
  须使用resetlogs选项打开数据库. 在效果上这相当于执行了一次数据库的不完全恢
  复(数据库闪回速度更快也更为灵活), 不同的是数据库闪回不能处理坏块和介质丢
  失, 这种情况下只能使用不完全恢复.
  – flashback query, transaction, and table
  这三种闪回操作均基于数据库的回滚段,
      • 闪回查询
      可以查询过去的某个时间点的数据, 比如半个小时之前的数据.
      • 事务闪回
      事务闪回会针对某个事务(通常指导致错误的事务)生成一个与该事务效
      果正好相反的事务, 以抵消该事务的影响.
      • 表闪回
      如果对表进行了误操作, 执行了错误的更新, 可以使用表闪回将该表闪回
      到某个时间点.
Flashback types
– flashback drop
在当前的数据库版本中DROP语句不会实际上删除一张表, 而只是将
表更改为一个系统生成的名称. 在该表占用的空间没有被覆盖的情况
下, 可以使用闪回删除将该表修改为之前的名称(数据仍存在).
Tip: 闪回删除不能应用于truncate table的情况.
– flashback data archive
以上三种闪回技术均存在时间限制, 数据库闪回限制于闪回日志, 闪
回查询限制于回滚段的存留, 闪回删除则依赖于表空间中可用的空间,
针对表的数据归档闪回则可以被设置为保存所有的历史记录, 因此也
常被称为(Total Recall). 当对一个表启用数据归档闪回时, 另外一个表
将会被创建以存储当前表数据所有的版本, 这通过进FBDA(flashback
data archive process)执行. 通常而言会为数据归档闪回指定一个时间.
Flashback
        - When to use
• 不同的闪回技术被使用在不同的场景, 下面描述
  了这些具体的场景:
 – flashback database
 在执行数据库的不完全恢复时, 可以考虑使用数据库
 闪回作为替代, 后者需要花费的时间更少. 数据库闪
 回需要进行相应的配置, 比如设置数据库归档模式 etc.
 – flashback drop
 当需要撤销对表的删除操作时(un-drop), 使用闪回删
 除, 该表将恢复到被删除之前的状态.
 – flashback table, transaction
 表/事务闪回用于更为细粒度的数据恢复.
 Tip: 对于介质丢失或者损坏的情形, 闪回技术无法进行处
 理, 应当使用传统的数据还原和恢复机制.
Flashback Database
               - Architecture
• Architecture
  当数据库闪回被启用, 数据块缓冲区的修改将导致该数据块被拷贝到SGA
  一个新的内存缓冲区: 闪回缓冲区(flashback buffer). 随后RVWR(Recovery
  Writer)进程将该缓冲区的内容写入到闪回日志(flashback logs), 闪回日志记
  录的是数据块历史版本的内容.
  Tip: 与重做日志不同的是, 闪回日志不能进行归档和多路复用. 它被自动创
  建和管理.
  Tip: 不是所有对数据块的修改都会导致该版本被写入闪回日志, 这样会对
  数据库的整体性能产生巨大影响.
  当执行数据库闪回时, 根据闪回的时间点, 闪回日志中的相应的数据块(与
  闪回时间点最近的)被拷贝至数据文件中, 此时数据库会处在一种不一致的
  状态(闪回日志没有记录数据块所有的历史版本). 重做日志将会被使用, 从
  而将数据库恢复到一致的状态. 示例:
  数据块A在10:00/10:05被修改, 10:00的修改被拷贝至闪回日志; 数据块B在
  10:05/10:20被修改, 均被拷贝至闪回日志. 此时是11:00, 需要将数据库闪回
  到10:15. 数据块闪回操作将会拷贝数据块A在10:00的版本和数据块B在
  10:05的版本, 之后执行重做日志.
  Tip: 数据块闪回要求数据库运行在归档模式, 并且在闪回操作之后需要使
  用resetlogs选项打开数据库.
Flashback Database
              - Configuration
• 配置数据库闪回会导致一定的downtime, 因为有的配置只能
  在mount阶段执行. 按照如下步骤进行配置:
 – 配置数据库归档模式, 使用下面的SQL进行检查:
 select log_mode from v$database;
 – 配置闪回区(flash recovery area), 参考:
 《Configure Database for Backup and Recovery》
 – 配置闪回日志存留的时间, 这限制了数据库能够向前闪回的时间
    段. 使用参数db_flashback_retention_target进行配置, 单位为分钟,
    默认为1天. 示例:
    alter system set db_flashback_retention_target=240;
 – 重启数据库至mount, 开启闪回后打开数据库
    shutdown immeidate;
    startup mount;
    alter database flashback on;
    alter database open;
Flashback Database
                 - Monitor
• 可以通过以下方面监控数据库闪回的状态,
 – 是否开始了数据库闪回?
   select flashback_on from v$database;
 – 在linux/Unix系统上可以查看到RVWR进程, 在
   windows平台它实现为ORACLE.exe的一个线程.
 – 通过视图v$flashback_database_log可以查询当前闪
   回日志占用的空间, 以及为达到目标预估需要的空
   间, 数据库能闪回到的最早时间;
   通过视图v$flashback_database_stat查询为支持数
   据库闪回在每小时进行的IO读写统计信息
 – 通过以下查询闪回缓冲占用的内存,
   select * from v$sgastat where name = 'flashback generation buff';
Flashback Database
                    - SQL*PLUS
• 可以通过以下三种方式进行数据库闪回操作: SQL*PLUS, RMAN以及
  Database Control, 无论使用哪种方式实质上执行的动作是一样的:
   – 关闭数据库并重启至MOUNT阶段;
   – 将数据库闪回到指定的时间点, SCN或者某个日志切换序号;
   – 使用resetlogs选项打开数据库.
• 下面以一个假设的情况进行演示, 某用户在2013/3/17日下午3点之后drop
  了一张表, 现在需要使用数据库闪回恢复该表. 由于无法确定具体的删除时
  间, 首先闪回到3:00:
      shutdown abort;
      startup mount;
      flashback database to timestamp to_timestamp('07-03-13 15:00:00',
                'dd-mm-yy hh24:mi:ss');
     alter database open read only;
  此时发现该表已经存在, 可以重复执行上面的动作进行检查以恢复更多的
  数据. 最后使用如下命令正常打开数据库:
      shutdown abort;
     startup mount;
      alter database open resetlogs;
Flashback Database
       - RMAN & Database Control
• 类似地在RMAN中也使用flashback database命
  令执行数据库闪回, 示例:
 flashback database to time = to_date('20-12-08 10:00:00',‘
             yy-mm-dd hh24:mi:ss');
 flashback database to scn=2728665;
 flashback database to sequence=2123 thread=1;
• 也可以在database control执行数据库闪回, 与
  前两种方式不同的是, 它只能指定闪回到某分
  钟, RMAN可以指定秒, SQL*PLUS可以闪回到某
  个时间戳.
Flashback Drop
                       - Overview
• 从数据库版本10g开始, 在执行DROP命令删除表时实际上执行的是alter
  table ... rename to命令修改了表的名称, 可以通过user_recyclebin和
  dba_recyclebin视图查询这些被删除的对象.闪回删除正是利用了这一特
  性, 它能够将表恢复到删除之前的状态, 这包括表的数据/索引/触发器和
  权限设置/非空和主键约束, 但不包含外键约束(被物理删除).
  Tip: drop table时如果指定purge选项, 将无法在回收器中找到相应的记录.
• 闪回删除不能确保能够成功执行, 这有可能是之前表占用的空间被覆盖,
  或者创建了另一张同名的表. 下面是一个执行闪回删除的示例:
    conn demo/demo;
    drop table newtab purge;
    select * from newtab; -- error
    flashbask table newtab to before drop;
  Tip: 如果需要闪回的表名称已经被使用那么必须使用rename to子句对表进行
       重命名.
  Tip: SYSTEM表空间的表不支持闪回删除, 它们被删除时会立即purge掉.
Flashback Drop
                - Recycle Bin
• 回收站用于管理已经模式下被drop掉的对象,
  回收站对象的空间在需要使用时可以被覆盖.
  默认情况下回收站可用, 使用实例参数
  RECYCLEBIN控制是否启用回收站, 该参数是一
  个动态参数. 可以在session或者system级别设
  置.
• 查看回收站的内容
 – 使用show recyclebin命令查看;
 – 查询dba_recyclebin或者user_recyclebin视图. 示例:
   select original_name, object_name, operation, type,
     droptime, can_undrop from user_recyclebin;
Flashback Query
                         - Overview & Basic
•   自9i版本开始闪回查询被引入, 在该版本中可用于查询数据库在过去某个时间点的数据. 在后续的版
    本中, 闪回查询功能被增强, 可用于查询数据行的所有版本、撤销已提交的事务、或者将表闪回到
    过去的某一个时间点 .
    Tip: 闪回查询的所有形式均依赖于回滚数据.
•   Basic Flashback Query
    下面是一个基础闪回查询的示例:
    select to_char(sysdate,'dd-mm-yy hh24:mi:ss') from dual; -- 07-03-13 23:57:57
    select * from newtab;
          C2
          ---------
          07-MAR-13
    delete from newtab;
    commit;
    select * from newtab; -- no data
    select * from newtab as of timestamp to_timestamp('07-03-13 23:57:57',
            'dd-mm-yy hh24:mi:ss'); -- same data as above
    有的时候需要连续执行多个闪回查询, 为了避免在每次查询都要指定闪回的时间点, 可以通过以下
    调用将查询设置在某一个时间点:
    execute dbms_flashback.enable_at_time(to_timestamp('27-12-08 16:54:06',
         'dd-mm-yy hh24:mi:ss'));
    取消该设置:
    execute dbms_flashback.disable;
    Tip: 如果无法通过回滚段重建指定时间点的数据, 那么ORA-08180: “No snapshot found based on
    specified time”错误将会被抛出.
Flashback Query
                           - Flashback Table
•   表闪回利用了回滚段, 在一个独立的事务中进行回滚操作. 如果闪回的表存在外键约束, 那么闪回操
    作通常会失败. 表闪回的一个前提条件是该表要开启行迁移(row movement). 下面以dep和emp表为
    例, 其中emp外键引用了dep表:
    -- 数据初始化
    create table dep(id NUMBER primary key, name VARCHAR2(100),
            location VARCHAR2(200));
    create table EMP(id NUMBER, name VARCHAR2(100), title VARCHAR2(100),
            dep_id NUMBER);
    alter table emp add constraint fk_emp_dep foreign key(dep_id) references dep(id);
    insert into dep values(50,'SUPPORT','LONDON');
    insert into emp values(8000,'WATSON','ANALYST',50);
    commit;
    -- 闪回数据
    delete from emp where id = 8000;
    delete from dep where id = 50;
    commit;
    -- 执行表闪回
    flashback table emp to timestamp to_timestamp('08-03-13 10:00:00',
            ‘dd-mm-yy hh24:mi:ss’); -- ORA-08189提示表没有开启行迁移
    --表开启行迁移
    alter table emp enable row movement;
    alter table dep enable row movement;
Flashback Query
                    - Flashback Table
 再次对emp表执行闪回, 这一次会因为外键约束的原因
 失败. oracle支持同时对多个表进行闪回(外键约束在闪
 回操作的末尾进行检查), 以解决上述的问题:
 flashback table emp, dep to timestamp to_timestamp('08-03-13 10:00:00',
       'dd-mm-yy hh24:mi:ss');
• 表闪回操作还可能会因为下面的原因失败:
  – 违反主键约束, 某个主键在被删除之后被重用;
  – ORA-08180: 快照太旧;
  – ORA-00054: 行被锁定. 需要闪回的行被用户锁定;
  – ORA-01466: 表定义发生变化. 表闪回不支持闪回到之前表
    的定义;
  – 对于SYS模式下的对象, 不支持表闪回操作.
• 默认情况下进行表闪回时触发器被禁用, 可以通过如下
  方式启用触发器:
      flashback table emp,dept to scn 6539425 enable triggers;
Flashback Query
                     - Flashback Versions
• 版本查询可以用于查看数据的历史版本, 在执行该查询时以下伪列被支持:
  – VERSIONS_STARTSCN
  行数据版本被创建时的SCN, 使用insert或者update;
  – VERSIONS_STARTTIME
  行数据版本被创建时的时间;
  – VERSIONS_ENDSCN
  行数据版本被更新或者删除时的SCN;
  – VERSIONS_ENDTIME
  行数据版本被更新或者删除的时间;
  – VERSIONS_XID
  行数据版本被创建的事务标识;
  – VERSION_OPERATION
  行数据版本创建的操作, INSERT/UPDATE/DELETE.
 查询示例:
 select id, name, title, dep_id, versions_xid, versions_startscn, versions_endscn, versions_operation
 from emp versions between scn minvalue and maxvalue where id = 8000;
 Tip: versions between 子句还可以指定为时间间隔, 比如:
       versions between timestamp (systimestamp - 1/24) and systimestamp
 Tip: 版本查询不支持使用在外部表/临时表/V$视图, 因此它们不会生成undo.
Flashback Query
                  - Flashback Transaction
•   闪回查询和版本查询会使用特定对象的undo数据,事务闪回则需要分析特定事务的undo, 这可能涉
    及到很多不同的对象. 使用事务闪回的一个前提是开启数据库supplemental logging, 使用下面的命令:
    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
•   与事务闪回相关的视图是flashback_transaction_query, 该视图的undo_sql列包含了进行事务闪回操
    作相关的SQL语句. 查询该视图需要有select any transaction权限, 默认情况下该权限被分配给SYS账户
    和DBA角色. 接着以上面的emp/dep为例, 闪回对emp/8000的update事务:
    –   首先使用版本查询确认事务的id(versions_xid)
         select id, name, title, dep_id, versions_xid
         from emp versions between scn minvalue and maxvalue
         where id = 8000;
    –   使用flashback_transaction_query视图可以查看相应的undo sql
            select operation,undo_sql from flashback_transaction_query
            where xid=hextoraw('08000400DD030000');
    –   使用dbms_flashback包进行事务闪回, 示例:
         execute dbms_flashback.transaction_backout(numtxns=>1, xids=>sys.xid_array('08000400DD030000'),
            options=>dbms_flashback.cascade);
         commit; -- 提交
         该存储过程的参数说明:
         • numtxns 需要闪回的事务数量
         • xids                 事务id列表
         • options              附加选项, 可以有:
               – cascade        闪回事务时, 避免出现违反数据库约束
               – noncascade     不处理数据库约束, 这可能会导致闪回失败(默认值)
               – nonconflict_only
               – noncascade_force
Flashback and Undo
• 闪回查询完全依赖于UNDO数据, 如果某个时间点
  的undo数据被覆盖那么针对该时间点的闪回查询
  将会失败, “ORA-1555: 快照过旧”错误被抛出.
  undo数据被保存在undo表空间中, 为了保证闪回
  查询在一定的时间段内能够成功执行, 需要作如
  下设置:
 – 设置实例参数undo_retention;
 – 设置undo表空间的RETENTION GUARANTEE属性.
 这样带来的一个问题是, 如果表空间的大小没有被设置
 为一个合理的大小, 在表空间被使用完时, 会导致当前事
 务的DML操作停止往下执行(hanged). 可以通v$undostat
 视图计算undo表空间合理的大小.
Flashback Data Archive
•   前面介绍的闪回技术在时间上都有一定的限制(通常不会太长), 归档闪回则可以设置为闪回到过去的任意时间. 下
    面使用示例进行演示:
     –   创建用于归档闪回的表空间, 该表空间用于存放支持归档闪回表的历史数据
    create tablespace fda datafile 'fda1.dbf' size 10m;
     –   在该表空间中创建闪回归档, 指定存留时间为7Y
    create flashback archive fla1 tablespace fda retention 7 year;
     –   创建相应的用户并授予权限
    grant dba to fbdauser identified by fbdauser;
    grant flashback archive on fla1 to fbdauser;
     –   登录该用户创建表并设置归档闪回
    connect fbdauser/fbdauser
    create table t1 as select * from all_users;
    alter table t1 flashback archive fla1;

     –   查询FDA表空间, 相应的段被创建, 该段包含了被保护对象的历史数据
    select segment_name,segment_type from dba_segments where tablespace_name='FDA';
     –   实例归档查询
    delete from t1;
    commit;
    select count(*) from t1;
    select count(*) from t1 as of timestamp(sysdate - 2/1440);

     –   as SYSDBA
    alter table fbdauser.t1 no flashback archive;
    drop user fbdauser cascade;
    drop tablespace fda including contents and datafiles;
    drop flashback archive fla1;
END

More Related Content

PDF
11g新特性streams同步捕获
PPTX
7, OCP - configure database for backup and recovery
PPT
Essential oracle security internal for dba
PDF
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
DOC
MySQL 6.0 下的cluster + replicate - 20080220
PDF
TomCat迁移步骤简述以及案例
PDF
配置Oracle 10g 双向流复制
PPT
分区表基础知识培训
11g新特性streams同步捕获
7, OCP - configure database for backup and recovery
Essential oracle security internal for dba
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
MySQL 6.0 下的cluster + replicate - 20080220
TomCat迁移步骤简述以及案例
配置Oracle 10g 双向流复制
分区表基础知识培训

What's hot (20)

PDF
Mysql企业备份发展及实践
PDF
A.oracle 查询结果的缓存问题
PDF
Sql调优clustering factor影响数据删除速度一例
PPTX
5, OCP - oracle storage
PPTX
9, OCP - restore and recovery with rman
PPT
Oracle Data Buffer Cache
PDF
Itpub电子杂志(第五期)
PDF
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
ODP
CKAN 技術介紹 (基礎篇)
PDF
Oracle试题Exam Adminv1.1
ODP
CKAN 技術介紹 (開發篇)
PDF
PostgreSQL 9 Standby
DOC
Cassandra的初步使用及一些简单的操作
PDF
Mysql集群
PDF
Mysql性能分析之临时表(共享)
PDF
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
PDF
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
PDF
Oracle Tablespace介紹
PDF
了解Oracle在线重定义online redefinition
PPT
Mysql展示功能与源码对应
Mysql企业备份发展及实践
A.oracle 查询结果的缓存问题
Sql调优clustering factor影响数据删除速度一例
5, OCP - oracle storage
9, OCP - restore and recovery with rman
Oracle Data Buffer Cache
Itpub电子杂志(第五期)
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
CKAN 技術介紹 (基礎篇)
Oracle试题Exam Adminv1.1
CKAN 技術介紹 (開發篇)
PostgreSQL 9 Standby
Cassandra的初步使用及一些简单的操作
Mysql集群
Mysql性能分析之临时表(共享)
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
Oracle Tablespace介紹
了解Oracle在线重定义online redefinition
Mysql展示功能与源码对应
Ad

Viewers also liked (16)

PDF
Gable Estates_Sept16
PPTX
CIO Event - Is the IT department dead?
PPTX
6, OCP - oracle security
PDF
alzhosaportfolio2 (1)
PPT
Caso ACA-Comunicación e Imagen-2007
PDF
Facts&Figures E-Commerce Paris (FR)
PPTX
Brandmark Work
PDF
Untitled Presentation
PPTX
Sitemans Geekstipend (uoffisiell)
DOC
שיטות הסתברותיות - תרגול 8
PPTX
Bid Winning Graphics
PDF
INTERNSHIP ON EXPORT-IMPORT PROCEDURES AT MARKS CARGO PRIVATE LIMITED, PUDUCH...
PDF
Triskalia - Plaquette Institutionnelle
PDF
Innovative lesson plan
PPTX
5.(2주제 절삭가공) 구체적으로 추진하는 원가절감 수법
PDF
Template transfer or change of ownership – no objection letter - mobile number
Gable Estates_Sept16
CIO Event - Is the IT department dead?
6, OCP - oracle security
alzhosaportfolio2 (1)
Caso ACA-Comunicación e Imagen-2007
Facts&Figures E-Commerce Paris (FR)
Brandmark Work
Untitled Presentation
Sitemans Geekstipend (uoffisiell)
שיטות הסתברותיות - תרגול 8
Bid Winning Graphics
INTERNSHIP ON EXPORT-IMPORT PROCEDURES AT MARKS CARGO PRIVATE LIMITED, PUDUCH...
Triskalia - Plaquette Institutionnelle
Innovative lesson plan
5.(2주제 절삭가공) 구체적으로 추진하는 원가절감 수법
Template transfer or change of ownership – no objection letter - mobile number
Ad

Similar to 10, OCP - flashback (16)

PPT
Oracle的闪回特性
PDF
Mvcc (oracle, innodb, postgres)
PDF
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
PDF
Oracle数据库安全:11g默认审计选项
PPT
Oracle数据库体系结构简介.ppt
PDF
Sql语句大全大全(经典珍藏版)
PPT
Oracle数据库分析函数详解
PDF
Mysql开发与优化
PPT
mysql总结
DOC
Jdbc4 0 规范技术预研
PPT
Altibase管理培训 优化篇 v1.1
PDF
Oracle中比对2张表之间数据是否一致的几种方法
PPTX
My sql 5.6新特性深入剖析——innodb引擎
PDF
A.oracle 数据字典与脚本初步
PPTX
Sql语句编写优化和基本原理总结
PDF
网易分布式数据库平台
Oracle的闪回特性
Mvcc (oracle, innodb, postgres)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
Oracle数据库安全:11g默认审计选项
Oracle数据库体系结构简介.ppt
Sql语句大全大全(经典珍藏版)
Oracle数据库分析函数详解
Mysql开发与优化
mysql总结
Jdbc4 0 规范技术预研
Altibase管理培训 优化篇 v1.1
Oracle中比对2张表之间数据是否一致的几种方法
My sql 5.6新特性深入剖析——innodb引擎
A.oracle 数据字典与脚本初步
Sql语句编写优化和基本原理总结
网易分布式数据库平台

More from ted-xu (20)

PPTX
11, OCP - awr & alert system
PPTX
8, OCP - backup with rman
PPTX
4, OCP - oracle networking
PPTX
3, OCP - instance management
PPTX
2, OCP - installing and creating a database
PPTX
1, OCP - architecture intro
PPTX
12, OCP - performance tuning
PPTX
7, business event system
PPTX
6, workflow miscellaneous
PPTX
5, workflow function activity
PPTX
4, workflow tables & api
PPTX
3, workflow in ebs
PPTX
2, a simple workflow
PPTX
1, workflow intro
PPTX
8, bes tables & api
DOCX
OPM Recipe designer notes
PPTX
5, sed
PPTX
4, grep
PPTX
3, regular expression
PPTX
2, bash synax simplified
11, OCP - awr & alert system
8, OCP - backup with rman
4, OCP - oracle networking
3, OCP - instance management
2, OCP - installing and creating a database
1, OCP - architecture intro
12, OCP - performance tuning
7, business event system
6, workflow miscellaneous
5, workflow function activity
4, workflow tables & api
3, workflow in ebs
2, a simple workflow
1, workflow intro
8, bes tables & api
OPM Recipe designer notes
5, sed
4, grep
3, regular expression
2, bash synax simplified

10, OCP - flashback

  • 2. Overview • oracle数据库闪回技术主要使用于纠正用户错 误, 比如错误地提交了事务, 在某些时候闪回还 可以替代传统的数据库恢复操作. 本章将介绍 闪回技术的以下方面: – 从回收站中还原已删除的表 – 闪回查询(flashback query) – 闪回事务(flashback transaction) – 闪回表相关的操作(flashback table operations) – 数据库闪回 – 设置和使用闪回数据的归档
  • 3. Flashback types • 共有四种闪回技术, 可以应用在不同的方面, 在功能上它们存在一定的交集. 分别简述如下: – flashback database 数据库闪回对数据库进行回滚, 最终将数据库还原至某一个过去的时间点, 此时必 须使用resetlogs选项打开数据库. 在效果上这相当于执行了一次数据库的不完全恢 复(数据库闪回速度更快也更为灵活), 不同的是数据库闪回不能处理坏块和介质丢 失, 这种情况下只能使用不完全恢复. – flashback query, transaction, and table 这三种闪回操作均基于数据库的回滚段, • 闪回查询 可以查询过去的某个时间点的数据, 比如半个小时之前的数据. • 事务闪回 事务闪回会针对某个事务(通常指导致错误的事务)生成一个与该事务效 果正好相反的事务, 以抵消该事务的影响. • 表闪回 如果对表进行了误操作, 执行了错误的更新, 可以使用表闪回将该表闪回 到某个时间点.
  • 4. Flashback types – flashback drop 在当前的数据库版本中DROP语句不会实际上删除一张表, 而只是将 表更改为一个系统生成的名称. 在该表占用的空间没有被覆盖的情况 下, 可以使用闪回删除将该表修改为之前的名称(数据仍存在). Tip: 闪回删除不能应用于truncate table的情况. – flashback data archive 以上三种闪回技术均存在时间限制, 数据库闪回限制于闪回日志, 闪 回查询限制于回滚段的存留, 闪回删除则依赖于表空间中可用的空间, 针对表的数据归档闪回则可以被设置为保存所有的历史记录, 因此也 常被称为(Total Recall). 当对一个表启用数据归档闪回时, 另外一个表 将会被创建以存储当前表数据所有的版本, 这通过进FBDA(flashback data archive process)执行. 通常而言会为数据归档闪回指定一个时间.
  • 5. Flashback - When to use • 不同的闪回技术被使用在不同的场景, 下面描述 了这些具体的场景: – flashback database 在执行数据库的不完全恢复时, 可以考虑使用数据库 闪回作为替代, 后者需要花费的时间更少. 数据库闪 回需要进行相应的配置, 比如设置数据库归档模式 etc. – flashback drop 当需要撤销对表的删除操作时(un-drop), 使用闪回删 除, 该表将恢复到被删除之前的状态. – flashback table, transaction 表/事务闪回用于更为细粒度的数据恢复. Tip: 对于介质丢失或者损坏的情形, 闪回技术无法进行处 理, 应当使用传统的数据还原和恢复机制.
  • 6. Flashback Database - Architecture • Architecture 当数据库闪回被启用, 数据块缓冲区的修改将导致该数据块被拷贝到SGA 一个新的内存缓冲区: 闪回缓冲区(flashback buffer). 随后RVWR(Recovery Writer)进程将该缓冲区的内容写入到闪回日志(flashback logs), 闪回日志记 录的是数据块历史版本的内容. Tip: 与重做日志不同的是, 闪回日志不能进行归档和多路复用. 它被自动创 建和管理. Tip: 不是所有对数据块的修改都会导致该版本被写入闪回日志, 这样会对 数据库的整体性能产生巨大影响. 当执行数据库闪回时, 根据闪回的时间点, 闪回日志中的相应的数据块(与 闪回时间点最近的)被拷贝至数据文件中, 此时数据库会处在一种不一致的 状态(闪回日志没有记录数据块所有的历史版本). 重做日志将会被使用, 从 而将数据库恢复到一致的状态. 示例: 数据块A在10:00/10:05被修改, 10:00的修改被拷贝至闪回日志; 数据块B在 10:05/10:20被修改, 均被拷贝至闪回日志. 此时是11:00, 需要将数据库闪回 到10:15. 数据块闪回操作将会拷贝数据块A在10:00的版本和数据块B在 10:05的版本, 之后执行重做日志. Tip: 数据块闪回要求数据库运行在归档模式, 并且在闪回操作之后需要使 用resetlogs选项打开数据库.
  • 7. Flashback Database - Configuration • 配置数据库闪回会导致一定的downtime, 因为有的配置只能 在mount阶段执行. 按照如下步骤进行配置: – 配置数据库归档模式, 使用下面的SQL进行检查: select log_mode from v$database; – 配置闪回区(flash recovery area), 参考: 《Configure Database for Backup and Recovery》 – 配置闪回日志存留的时间, 这限制了数据库能够向前闪回的时间 段. 使用参数db_flashback_retention_target进行配置, 单位为分钟, 默认为1天. 示例: alter system set db_flashback_retention_target=240; – 重启数据库至mount, 开启闪回后打开数据库 shutdown immeidate; startup mount; alter database flashback on; alter database open;
  • 8. Flashback Database - Monitor • 可以通过以下方面监控数据库闪回的状态, – 是否开始了数据库闪回? select flashback_on from v$database; – 在linux/Unix系统上可以查看到RVWR进程, 在 windows平台它实现为ORACLE.exe的一个线程. – 通过视图v$flashback_database_log可以查询当前闪 回日志占用的空间, 以及为达到目标预估需要的空 间, 数据库能闪回到的最早时间; 通过视图v$flashback_database_stat查询为支持数 据库闪回在每小时进行的IO读写统计信息 – 通过以下查询闪回缓冲占用的内存, select * from v$sgastat where name = 'flashback generation buff';
  • 9. Flashback Database - SQL*PLUS • 可以通过以下三种方式进行数据库闪回操作: SQL*PLUS, RMAN以及 Database Control, 无论使用哪种方式实质上执行的动作是一样的: – 关闭数据库并重启至MOUNT阶段; – 将数据库闪回到指定的时间点, SCN或者某个日志切换序号; – 使用resetlogs选项打开数据库. • 下面以一个假设的情况进行演示, 某用户在2013/3/17日下午3点之后drop 了一张表, 现在需要使用数据库闪回恢复该表. 由于无法确定具体的删除时 间, 首先闪回到3:00: shutdown abort; startup mount; flashback database to timestamp to_timestamp('07-03-13 15:00:00', 'dd-mm-yy hh24:mi:ss'); alter database open read only; 此时发现该表已经存在, 可以重复执行上面的动作进行检查以恢复更多的 数据. 最后使用如下命令正常打开数据库: shutdown abort; startup mount; alter database open resetlogs;
  • 10. Flashback Database - RMAN & Database Control • 类似地在RMAN中也使用flashback database命 令执行数据库闪回, 示例: flashback database to time = to_date('20-12-08 10:00:00',‘ yy-mm-dd hh24:mi:ss'); flashback database to scn=2728665; flashback database to sequence=2123 thread=1; • 也可以在database control执行数据库闪回, 与 前两种方式不同的是, 它只能指定闪回到某分 钟, RMAN可以指定秒, SQL*PLUS可以闪回到某 个时间戳.
  • 11. Flashback Drop - Overview • 从数据库版本10g开始, 在执行DROP命令删除表时实际上执行的是alter table ... rename to命令修改了表的名称, 可以通过user_recyclebin和 dba_recyclebin视图查询这些被删除的对象.闪回删除正是利用了这一特 性, 它能够将表恢复到删除之前的状态, 这包括表的数据/索引/触发器和 权限设置/非空和主键约束, 但不包含外键约束(被物理删除). Tip: drop table时如果指定purge选项, 将无法在回收器中找到相应的记录. • 闪回删除不能确保能够成功执行, 这有可能是之前表占用的空间被覆盖, 或者创建了另一张同名的表. 下面是一个执行闪回删除的示例: conn demo/demo; drop table newtab purge; select * from newtab; -- error flashbask table newtab to before drop; Tip: 如果需要闪回的表名称已经被使用那么必须使用rename to子句对表进行 重命名. Tip: SYSTEM表空间的表不支持闪回删除, 它们被删除时会立即purge掉.
  • 12. Flashback Drop - Recycle Bin • 回收站用于管理已经模式下被drop掉的对象, 回收站对象的空间在需要使用时可以被覆盖. 默认情况下回收站可用, 使用实例参数 RECYCLEBIN控制是否启用回收站, 该参数是一 个动态参数. 可以在session或者system级别设 置. • 查看回收站的内容 – 使用show recyclebin命令查看; – 查询dba_recyclebin或者user_recyclebin视图. 示例: select original_name, object_name, operation, type, droptime, can_undrop from user_recyclebin;
  • 13. Flashback Query - Overview & Basic • 自9i版本开始闪回查询被引入, 在该版本中可用于查询数据库在过去某个时间点的数据. 在后续的版 本中, 闪回查询功能被增强, 可用于查询数据行的所有版本、撤销已提交的事务、或者将表闪回到 过去的某一个时间点 . Tip: 闪回查询的所有形式均依赖于回滚数据. • Basic Flashback Query 下面是一个基础闪回查询的示例: select to_char(sysdate,'dd-mm-yy hh24:mi:ss') from dual; -- 07-03-13 23:57:57 select * from newtab; C2 --------- 07-MAR-13 delete from newtab; commit; select * from newtab; -- no data select * from newtab as of timestamp to_timestamp('07-03-13 23:57:57', 'dd-mm-yy hh24:mi:ss'); -- same data as above 有的时候需要连续执行多个闪回查询, 为了避免在每次查询都要指定闪回的时间点, 可以通过以下 调用将查询设置在某一个时间点: execute dbms_flashback.enable_at_time(to_timestamp('27-12-08 16:54:06', 'dd-mm-yy hh24:mi:ss')); 取消该设置: execute dbms_flashback.disable; Tip: 如果无法通过回滚段重建指定时间点的数据, 那么ORA-08180: “No snapshot found based on specified time”错误将会被抛出.
  • 14. Flashback Query - Flashback Table • 表闪回利用了回滚段, 在一个独立的事务中进行回滚操作. 如果闪回的表存在外键约束, 那么闪回操 作通常会失败. 表闪回的一个前提条件是该表要开启行迁移(row movement). 下面以dep和emp表为 例, 其中emp外键引用了dep表: -- 数据初始化 create table dep(id NUMBER primary key, name VARCHAR2(100), location VARCHAR2(200)); create table EMP(id NUMBER, name VARCHAR2(100), title VARCHAR2(100), dep_id NUMBER); alter table emp add constraint fk_emp_dep foreign key(dep_id) references dep(id); insert into dep values(50,'SUPPORT','LONDON'); insert into emp values(8000,'WATSON','ANALYST',50); commit; -- 闪回数据 delete from emp where id = 8000; delete from dep where id = 50; commit; -- 执行表闪回 flashback table emp to timestamp to_timestamp('08-03-13 10:00:00', ‘dd-mm-yy hh24:mi:ss’); -- ORA-08189提示表没有开启行迁移 --表开启行迁移 alter table emp enable row movement; alter table dep enable row movement;
  • 15. Flashback Query - Flashback Table 再次对emp表执行闪回, 这一次会因为外键约束的原因 失败. oracle支持同时对多个表进行闪回(外键约束在闪 回操作的末尾进行检查), 以解决上述的问题: flashback table emp, dep to timestamp to_timestamp('08-03-13 10:00:00', 'dd-mm-yy hh24:mi:ss'); • 表闪回操作还可能会因为下面的原因失败: – 违反主键约束, 某个主键在被删除之后被重用; – ORA-08180: 快照太旧; – ORA-00054: 行被锁定. 需要闪回的行被用户锁定; – ORA-01466: 表定义发生变化. 表闪回不支持闪回到之前表 的定义; – 对于SYS模式下的对象, 不支持表闪回操作. • 默认情况下进行表闪回时触发器被禁用, 可以通过如下 方式启用触发器: flashback table emp,dept to scn 6539425 enable triggers;
  • 16. Flashback Query - Flashback Versions • 版本查询可以用于查看数据的历史版本, 在执行该查询时以下伪列被支持: – VERSIONS_STARTSCN 行数据版本被创建时的SCN, 使用insert或者update; – VERSIONS_STARTTIME 行数据版本被创建时的时间; – VERSIONS_ENDSCN 行数据版本被更新或者删除时的SCN; – VERSIONS_ENDTIME 行数据版本被更新或者删除的时间; – VERSIONS_XID 行数据版本被创建的事务标识; – VERSION_OPERATION 行数据版本创建的操作, INSERT/UPDATE/DELETE. 查询示例: select id, name, title, dep_id, versions_xid, versions_startscn, versions_endscn, versions_operation from emp versions between scn minvalue and maxvalue where id = 8000; Tip: versions between 子句还可以指定为时间间隔, 比如: versions between timestamp (systimestamp - 1/24) and systimestamp Tip: 版本查询不支持使用在外部表/临时表/V$视图, 因此它们不会生成undo.
  • 17. Flashback Query - Flashback Transaction • 闪回查询和版本查询会使用特定对象的undo数据,事务闪回则需要分析特定事务的undo, 这可能涉 及到很多不同的对象. 使用事务闪回的一个前提是开启数据库supplemental logging, 使用下面的命令: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; • 与事务闪回相关的视图是flashback_transaction_query, 该视图的undo_sql列包含了进行事务闪回操 作相关的SQL语句. 查询该视图需要有select any transaction权限, 默认情况下该权限被分配给SYS账户 和DBA角色. 接着以上面的emp/dep为例, 闪回对emp/8000的update事务: – 首先使用版本查询确认事务的id(versions_xid) select id, name, title, dep_id, versions_xid from emp versions between scn minvalue and maxvalue where id = 8000; – 使用flashback_transaction_query视图可以查看相应的undo sql select operation,undo_sql from flashback_transaction_query where xid=hextoraw('08000400DD030000'); – 使用dbms_flashback包进行事务闪回, 示例: execute dbms_flashback.transaction_backout(numtxns=>1, xids=>sys.xid_array('08000400DD030000'), options=>dbms_flashback.cascade); commit; -- 提交 该存储过程的参数说明: • numtxns 需要闪回的事务数量 • xids 事务id列表 • options 附加选项, 可以有: – cascade 闪回事务时, 避免出现违反数据库约束 – noncascade 不处理数据库约束, 这可能会导致闪回失败(默认值) – nonconflict_only – noncascade_force
  • 18. Flashback and Undo • 闪回查询完全依赖于UNDO数据, 如果某个时间点 的undo数据被覆盖那么针对该时间点的闪回查询 将会失败, “ORA-1555: 快照过旧”错误被抛出. undo数据被保存在undo表空间中, 为了保证闪回 查询在一定的时间段内能够成功执行, 需要作如 下设置: – 设置实例参数undo_retention; – 设置undo表空间的RETENTION GUARANTEE属性. 这样带来的一个问题是, 如果表空间的大小没有被设置 为一个合理的大小, 在表空间被使用完时, 会导致当前事 务的DML操作停止往下执行(hanged). 可以通v$undostat 视图计算undo表空间合理的大小.
  • 19. Flashback Data Archive • 前面介绍的闪回技术在时间上都有一定的限制(通常不会太长), 归档闪回则可以设置为闪回到过去的任意时间. 下 面使用示例进行演示: – 创建用于归档闪回的表空间, 该表空间用于存放支持归档闪回表的历史数据 create tablespace fda datafile 'fda1.dbf' size 10m; – 在该表空间中创建闪回归档, 指定存留时间为7Y create flashback archive fla1 tablespace fda retention 7 year; – 创建相应的用户并授予权限 grant dba to fbdauser identified by fbdauser; grant flashback archive on fla1 to fbdauser; – 登录该用户创建表并设置归档闪回 connect fbdauser/fbdauser create table t1 as select * from all_users; alter table t1 flashback archive fla1; – 查询FDA表空间, 相应的段被创建, 该段包含了被保护对象的历史数据 select segment_name,segment_type from dba_segments where tablespace_name='FDA'; – 实例归档查询 delete from t1; commit; select count(*) from t1; select count(*) from t1 as of timestamp(sysdate - 2/1440); – as SYSDBA alter table fbdauser.t1 no flashback archive; drop user fbdauser cascade; drop tablespace fda including contents and datafiles; drop flashback archive fla1;
  • 20. END