博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

oracle-11g-闪回技术

Posted on 2020-02-10 00:09  myuserkill  阅读(444)  评论(0编辑  收藏  举报

一.4种闪回技术:

①闪回数据库

  以当前数据库为起点,在时间上回退,逐步改变知道顺序回退完成的所有工作。最终的结果就像是执行了不完整恢复,将丢失闪回点之后的所有工作,

  并且实际上得使用resetlogs打开数据库。

        !!!!!闪回数据库不能撤销物理损坏,只能恢复由用户错误造成的逻辑错误。

②闪回查询、事务和表

  三种闪回技术都基于使用撤销段(undo段)。

    (1)闪回查询:允许查询过去某个时间的数据库,利用此技术甚至可以选取过去某段时间内一个行的所有版本,以便了解改行的历史操作,包括操作

        时间、操作人和做出每个更改的事务的标识符。

    (2)闪回事务自动执行修复过程。一旦使用了闪回查询确认了引起问题的事务,oracle可以构造SQL语句来反转事务中的更改。无法回滚提交的更改,

      但可以构造另一事务以反转第一个错误事务的影响。与闪回数据不同的是:闪回事务并不会丢失数据,所做的其他所有工作仍然有效,并且数据库保持当前状态。

    (3)闪回表:指示oracle反转从特定时间点以来对该表所做的所有更改,而保持其他所有表的当前状态。

③闪回删除:可以撤销删除一个表,通过将drop命令映射到rename命令实现,不能实现truncate的闪回,purge的闪回,,可以还原任何相关的索引

      及权限和表本身(外键约束除外)。

④闪回数据归档(flashback data archive)

  11g包含一个有时称为Total Recall的功能。

    以上三种闪回有时间限制:闪回数据库受日志大小限制

                闪回查询受撤销保留时间限制

                闪回删除受表空间的可用空间限制

    可以配置flashback data archive来无限期存储行的前映象(由FBDA进程写入)

二.闪回数据库体系结构相关恢复

  启用闪回数据库后,修改的块的映像会不时的从数据库缓冲区的缓存中复制到SGA内一个新的存储区域中,即闪回缓冲区。通过一个新的后台进程恢复写入器(Recovery Writer,RVWR)将闪回缓冲区上的内容刷到磁盘和闪回日志。

  执行数据库闪回时,oracle将会读取闪回日志以提取每个改变的数据库块版本,并将这些版本复制回数据文件。因为这些变化是按照逆时间的顺序应用到当前数据库的,这样做的效果是通过反转DBRn进程执行的写入操作及时回退数据库库。

  执行闪回时,oracle会使用闪回日志将数据库及时回退到期望的时间之前的某个时间点,然后按照不完整恢复中的常规方式应用重做日志(使用任何必需的归档重做日志和联机重做日志文件),以便将数据文件前滚到希望的确切时间。然后可以按照与普通的不完整恢复采用相同的方式,使用新的化身(incarnation)打开数据库。

    !!!!!!闪回数据库要求归档日志模式并使用alter database open  resetlogs来创建数据库的一个新化身。

     !!!!!闪回数据库所需的时间主要取决于需要撤销的更改的数量。  

  1.配置闪回数据库

    1.1确保数据库处于该当日志模式

        select log_mod from v$database;

    1.2创建闪回恢复区

        SQL>alter system set db_recovery_file_dest='/flash_recovery_area';

        SQL>alter system set db_recovery_file_dest_size=8G;

          !!!切记:闪回恢复区的用途不同于闪回日志,需要正确的设定大小

    1.3设置闪回目标保留时间

        SQL>alter system set db_flashback_retention_target=240;

          !!!此参数单位是分钟,默认1天,。闪回日志的空间以循环的方式重用,该参数指示oracle在重写它之前保存闪回数据的分钟数

    1.4关闭数据库并启动至加载状态

        SQL>shutdown immediate

        SQL>startup mount

    1.5启用闪回日志记录

        SQL>alter database flashback on;

    1.6打开数据库

        SQL>alter database open

  2.监视闪回数据库

    2.1确认是否启用闪回特性

        SQL>select flashback_on from v$database;

    2.2监视当前的闪回能力并估计为满足目标时间闪回日志所需的空间

        SQL>select * from v$flashback_database_log;

    2.3有关数据文件、联机重做日志文件和闪回日志文件占用磁盘I/O比例的历史视图

        SQL>select * from v$flashback_database_stat;  

                 --显示启用闪回数据库而付出的代价,计量单位是每小时必需的I/O字节数

    2.3闪回缓冲区的大小不受DBA的控制,可以查询

        SQL>select * from v$sgastat where name='flashback generation buffer';

  3.使用闪回数据库

      使用闪回数据库有三种途径:SQL*Plus,RMAN和Database Control,方法都是相同的:

          ·关闭数据库

          ·加载数据库闪回到某个时间点、SCN或日志切换序列号

          ·使用resetlogs打开数据库

        只要拥有需要的所有归档日志,闪回操作就能够完全自动的运行

  3.1使用SQL*Plus闪回

    SQL*Plus闪回语法接受时间戳和系统变更号(SCN),不接受日期和日志切换序列号

    3.1.1关闭数据库

        SQL>shutdown abort(此时任何类型的关闭都没有意义)

    3.1.2加载数据库并闪回

        SQL>startup mount

        SQL>flashback database to timestamp to_timestamp('20-12-08 10:00:00','dd-mm-yy hh24:mi:ss');

                    --与recover database until time不同,该命令对时间戳格式的NLS设置很敏感

        SQL>alter database open read only; 

                      --只读状态下,可以针对删除的模式进行查询,如果发现该模式仍然可用,便可恢复更多的数据。

        SQL>shutdown abort

        SQL>startup mount

        SQL>recover database until time '2008-12-20 10:02:00';

                    --前滚两分钟的数据,看是否恢复到需要的位置

        SQL>alter database open read only; 

                    --看是否恢复到需要的位置

        如果还没有到需要的位置:

        SQL>shutdown abort

        SQL>startup mount

        SQL>flashback database to timestamp to_timestamp('20-12-08 10:01:00','dd-mm-yy hh24:mi:ss'); 

                     --往后再多闪回1分钟 

        SQL>alter database open read only;    

          ·         --看是否恢复到需要的位置

              依次类推,如果现在模式还不可用,就再往前闪回几秒钟。如果发现模式可用,就执行几秒钟的恢复。

              可以重复执行闪回和恢复命令,直到找到希望的时间,在此期间通过之都模式下运行查询来测试。

              当找到满意的时间点时,执行最后一次数据库关闭并使用过resetlogs打开数据库,数据库正常使用。

  3.2使用RMAN执行闪回

      RMAN闪回,有三种选择:时间点,SCN或日志切换序列号

      RMAN>flashback database to time=to_date('20-12-08 10:00:00','yy-mm-dd hh24:mi:si');

      RMAN>flashback database to scn=272822255222;

      RMAN>flashback database to sequence=2123 thread=1;

        其余操作与SQL-Plus闪回操作相同。都是采用重复应用闪回和恢复的技术,找到打开数据库的最佳点

  4.限制生成的闪回数据量

      --就是关闭不需要闪回的表空间闪回特性

    SQL>alter tablespace <tablespace_name> flashback off;

            -----可以在数据库打开的状态下关闭表空间闪回特性,但需要在数据库加载状态下开启闪回特性。

    SQL>select * from v$tablespace;

            --此视图的flashback_on字段显示表空间是否开启闪回特性,因为是通过控制文件而非数据字典启用闪回功能的。

      !!!!如果一个或多个表空间不生成闪回数据,那么执行闪回操作前必须使构成表空间的数据文件脱机,然后闪回(包括隐式的恢复)可以正常进行。

      !!!recover将忽略脱机的数据文件,这与flashback是相同的。

三.闪回删除(flashback drop)

  SQL>set sqlprompt "_user'@'_connect_identifier"

              及时切换模式名,防止误删

  Flashback Drop允许将之前删除的表(非truncate)恢复到刚好删除之前的状态,同时还会恢复所有的索引以及任何触发器和权限。唯一的主键和非空约束也能被恢复,外键约束除外。   -----Flashback Drop命令仅使用于表,但也能恢复所有相关的对象-----外键约束除外。

    实现原理:9i版本:drop其实是一系列delete后加一个commit,数据并未删除,指示占用空间被标识为未占用,后期会被重写---可执行时间点恢复

         10g版本:drop<==>rename,删除的表被放在回收站里

    恢复授权原理:当授予一个对象权限时,通过名称指定对象并且底层存储的授权是通过它的对象号来引用的。rename并没有改变对象号

    !!!!使用闪回删除不能保证成功执行,但是很可能会生效,越早执行该命令,成功的可能性越大。

    !!!truncate表无法闪回

    !!!purge表后,回收站内无记录,无法闪回

    !!!system表空间下,drop表不会进入回收站,无法闪回

    !!!删除模式后,无法维护对象(表删除后,是rename并放到模式下的回收站里,模式都没了,对象也没了),无法闪回

    !!!自表删除后,一旦空间被重用,闪回删除无法恢复

                    以上六条,可通过闪回数据库闪回。

    闪回删除命令:

      SQL>flashback table <table_name> to before drop rename to <new_name>

        --table_name可用删除时的名字,也可用回收站中系统生成的名字,但是使用系统自动生成的名字时,需要用双引号引起来。

      SQL>show recyclebin   <==>   SQL>select * from dba/user_recyclebin;

                  --查看回收站中的内容

      相关数据字典:dba/user_objects,dba_user_constraints

四.回收站管理

  SQL>show recyclebin   <==>   SQL>select * from dba/user_recyclebin;

  oracle并不负责保存删除的表或索引。(只是能在此空间被重用之前恢复)

五.对回收站的空间进行回收

  1.删除的对象占用的空间处于不明确的状态:此时oracle可以任意重写这块空间

  2.启用数据文件的autoextend特性,oracle实际上不会自动扩展数据文件,它会优先重写回收站以增加数据文件大小

  3.可以用各种形式的purge永久性的清除删掉的对象:

    SQL>drop <table_name> purge;   --删除,不移入回收站

    SQL>purge table <table_name>  --从回收站清除表,如有重名,删最老的那个

    SQL>purge index <index_name>  --从回收站清除索引

    SQL>purge tablespace <tablespace_name>  --从表空间中清除所有已删除对象

    SQL>purge tablespace <tablespace_name> user <user_name> --从表空间中清除属于一个用户的所有已删除对象

    SQL>purge user_recyclebin  --清除回收站所有对象

    SQL>purge dba_recyclebin

六.闪回查询

  原理:将查询指定的时间映射到一个系统变更号SCN,每当查询找到自从该SCN以来更改的一个块,它将转到撤销段以提取回滚此更改所需的撤销数据。

      这种回滚是临时性的,并且仅对运行闪回查询的对话可见。-----撤销段必须可用

          所有形式的闪回查询依赖撤销数据以重构它在过去某个时间点的数据

    SQL>select * from <table_name> as of timestamp to_timestamp('27-12-28 16:65:06','dd-mm-yy hh24:mi:ss'); 

   !!!通过dbms_flashback程序包可以将整个会话回退到过去某个时间点

    SQL>execute dbma_flashback.enable_at_time(-> to_timestamp('27-12-28 16:65:06','dd-mm-yy hh24:mi:ss'));(此语句有误,有待核实)

            --此后,所有的查询将看到数据库在指定时间下的状态,其他会话看到的还是实时的数据,此会话目前处于冻结状态

     SQL>execute dbms_flashback_disable;

       !!!处于闪回模式时,无法执行DML命令

  启用闪回查询的语法接受时间戳和SCN,如果使用SCN,那么闪回转到的时间点时精确的。

                    如果指定的某个时间,那么它将映射到一个SCN上并且精度是3秒           

  1.闪回表查询

    1.1闪回操作是一个单独的事务

    1.2数据库不受影响,除非行锁定成为一个问题(不懂)

    1.3表上的触发器对闪回操作默认是禁用的

        手动启用:SQL>flashback table <table_name> to scn=18245453 enable tiggers;

    1.4表闪回经常会设计一个问题--存在外键关系的表,此时闪回会失败,解决办法:闪回表语句支持多个表一起闪回,在该事务的结尾检查约束

    1.5启用表闪回的第一步是------表支持行移动           

      SQL>alter table <table_name> enable row movement;

    1.6闪回表(当前会话下,将表闪回到过去某个时间点的状态)       

      SQL>flashback table <table_name> to timestamp to_timestamp('27-12-28 16:65:06','dd-mm-yy hh24:mi:ss')              

    1.7其他闪回失败的原因:

           ·在删除和闪回之间重用了键值,会出现主键约束

        ·没有足够的撤销信息返回到请求的时间

        ·其他用户锁定闪回作用的任何行

        ·闪回不能跨越DDL

        ·闪回的表处于system模式下

  2.闪回版本查询(flashback version query)

    ·一个行在它的生命周期内可能改变很多次

    ·只允许查看提交的版本--包换创建和结束每个版本的时间戳

    ·与闪回相关的伪列:

      ·versions_startscn   -insert或update创建此版本的行的scn

      ·versions_starttime  --创建此版本的行的时间戳

      ·versions_endscn  --delete或update使用此版本的行失效的scn

      ·versions_xid    --创建此版本的行的事务的唯一标识符

      ·versions_operation 创建此版本的行的事务执行的操作

     语法:eg.

          select empno,ename,sal,versions_startscn,versions_starttime,versions_endscn,versions_xid,versions_operation from emp

          versions between scn minvalue and maxvalue

          where empno=8000;      

 

    !!!versions between使用两个常量来标识scn,minvalue指的是oracle检索撤销段中最早的信息,maxvalue作为当前的scn,也可以基于时间:

        select empno,ename,sal,versions_startscn,versions_starttime,versions_endscn,versions_xid,versions_operation from emp

           versions between timestamp (systimestamp-1/24) and systimestamp    ---最近一小时的版本

        where empno=8000;

    !!!!!!闪回版本查询不能用于外部表、临时表或者v$视图,原因是这些对象都不生成撤销数据

  3.闪回事务查询

    闪回事务查询从一个不同的尺度来分析撤销数据:它会检索一个事务的所有撤销数据,二部考虑它影响了多少对象。

    关键视图:v$flashback_transaction_query,该视图数据敏感,需要权限才能访问(select any transaction)

  4.闪回和撤销数据

      为了保证在给定时间内闪回查询功能成功,设置撤销表空间的retention guarantee属性以及undo_retention实例参数,这将确保总能闪回指定的秒数,担负处的代价是,如果对于事务工作负荷来说,撤销表空间的大小设置的不够大,那么在执行dml时可能会挂起数据库。

七.闪回数据归档

   配置闪回数据归档将保证将表闪回到过去任意时间。

    FBDA:闪回数据归档进程

  记录闪回数据归档配置的数据字典视图:

    ·dba_flashback_archive  秒数配置的归档

    ·dba_flashback_archive_ts  显示每个表空间的每个归档分配的peie

    ·dba_flashback_archive_tables  列出启用了归档的表

  创建数据归档:1.创建供闪回数据归档的表空间

            SQL>create tablespace fda datafile 'fda.dbf' size 10m;

         2.在表空间创建一个保留时间为7年的闪回数据归档

            SQL>create flashback archive fla1 tablespace fda retention 7 year;

         3.创建模式并授予dba角色

            SQL>grant dba to fdauser identified by fdauser;

           4.授予yoghurt操作归档的必要权限

            SQL>grant flashback archive on fla1 to fdauser;

           5.以fdauser连接,创建一个表并为此表启用闪回数据归档

            SQL>conn fdauser/fdauser

            SQL>create table t1 as select * from all_users;

            SQL>alter table t1 flashback archive fla1;